// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_ASH_SYSTEM_PROCFS_UTIL_H_
#define CHROME_BROWSER_ASH_SYSTEM_PROCFS_UTIL_H_
#include <optional>
#include "base/files/file.h"
#include "base/files/file_path.h"
#include "base/process/process_handle.h"
namespace ash {
namespace system {
// A single process data from a /proc/[pid]/stat file.
struct SingleProcStat {
// Process PID.
pid_t pid = -1;
// Process name.
std::string name;
// Parent process PID.
pid_t ppid = -1;
// Scheduled time in user mode in jiffies.
int64_t utime = 0;
// Scheduled time in kernel mode in jiffies.
int64_t stime = 0;
// Number of pages in real memory.
int64_t rss = 0;
bool operator==(const SingleProcStat& rhs) const {
if (this->pid != rhs.pid)
return false;
if (this->name != rhs.name)
return false;
if (this->ppid != rhs.ppid)
return false;
if (this->utime != rhs.utime)
return false;
if (this->stime != rhs.stime)
return false;
if (this->rss != rhs.rss)
return false;
return true;
}
};
// Returns a single process information by reading a /proc/[pid]stat file.
std::optional<SingleProcStat> GetSingleProcStat(
const base::FilePath& stat_file);
// Returns the total CPU time used in jiffies by reading /proc/stat file.
// The input |stat_file| is used for testing.
std::optional<int64_t> GetCpuTimeJiffies(
const base::FilePath& stat_file = base::FilePath("/proc/stat"));
// A file object for "/proc/<pid>/stat".
class ProcStatFile {
public:
explicit ProcStatFile(base::ProcessId process_id);
ProcStatFile(ProcStatFile&&) = default;
ProcStatFile(ProcStatFile&) = delete;
~ProcStatFile();
// Returns whether the stat file is valid. See `base::File::IsValid()` for
// details.
bool IsValid() const;
// Returns whether the process is still alive or not.
bool IsPidAlive();
private:
base::File file_;
};
} // namespace system
} // namespace ash
#endif // CHROME_BROWSER_ASH_SYSTEM_PROCFS_UTIL_H_