// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// chromeos-pgmem - reports memory usage by process group.
//
// This utility uses the ProcessInfo class to gather information about process
// memory usage from /proc, and compute and print total usage split by process
// groups.  The groups are: chrome browser + helpers, chrome gpu process, chrome
// renderers, ARC++ processes, VMs, and daemons (user-level processes only, not
// including kernel daemons).  For each group, this reports total RSS and its
// separate components (anon, file, and shmem).  It also reports swap usage.

#include "metrics/process_meter.h"

#include <cinttypes>
#include <iostream>

#include <base/files/file_path.h>
#include <base/stl_util.h>
#include <base/strings/stringprintf.h>
#include <brillo/flag_helper.h>

namespace chromeos_metrics {

namespace {

const char* kGroupNames[] = {"browser", "gpu", "renderers",
                             "arc",     "vms", "daemons"};

static_assert(base::size(kGroupNames) == PG_KINDS_COUNT,
              "wrong number of kGroupNames");

}  // namespace

int PrintProcessGroupStats() {
  auto procfs_path = base::FilePath("/proc");
  ProcessInfo info(procfs_path, base::FilePath("/run"));
  info.Collect();
  info.Classify();

  std::cout << base::StringPrintf("group     total  anon  file shmem  swap\n");
  const int MiB = 1 << 20;
  for (int i = 0; i < PG_KINDS_COUNT; i++) {
    ProcessMemoryStats stats;
    ProcessGroupKind kind = static_cast<ProcessGroupKind>(i);
    AccumulateProcessGroupStats(procfs_path, info.GetGroup(kind), &stats);
    std::cout << base::StringPrintf("%-9s %5" PRIu64 " %5" PRIu64 " %5" PRIu64
                                    " %5" PRIu64 " %5" PRIu64,
                                    kGroupNames[i],
                                    stats.rss_sizes[MEM_TOTAL] / MiB,
                                    stats.rss_sizes[MEM_ANON] / MiB,
                                    stats.rss_sizes[MEM_FILE] / MiB,
                                    stats.rss_sizes[MEM_SHMEM] / MiB,
                                    stats.rss_sizes[MEM_SWAP] / MiB)
              << std::endl;
  }
  return 0;
}

}  // namespace chromeos_metrics

int main(int argc, const char* argv[]) {
  brillo::FlagHelper::Init(
      argc, argv, "chromeos-pgmem - reports memory usage by process group");
  return chromeos_metrics::PrintProcessGroupStats();
}
