1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be
3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file.
4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// This file contains internal routines that are called by other files in
6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// base/process/.
7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#ifndef BASE_PROCESS_INTERNAL_LINUX_H_
9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define BASE_PROCESS_INTERNAL_LINUX_H_
10b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
11cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include <stddef.h>
12cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include <stdint.h>
13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <unistd.h>
14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/files/file_path.h"
16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base {
18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass Time;
20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass TimeDelta;
21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace internal {
23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// "/proc"
25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratextern const char kProcDir[];
26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// "stat"
28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratextern const char kStatFile[];
29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Returns a FilePath to "/proc/pid".
31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbase::FilePath GetProcPidDir(pid_t pid);
32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Take a /proc directory entry named |d_name|, and if it is the directory for
34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// a process, convert it to a pid_t.
35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Returns 0 on failure.
36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// e.g. /proc/self/ will return 0, whereas /proc/1234 will return 1234.
37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratpid_t ProcDirSlotToPid(const char* d_name);
38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Reads /proc/<pid>/stat into |buffer|. Returns true if the file can be read
40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// and is non-empty.
41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool ReadProcStats(pid_t pid, std::string* buffer);
42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Takes |stats_data| and populates |proc_stats| with the values split by
44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// spaces. Taking into account the 2nd field may, in itself, contain spaces.
45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Returns true if successful.
46b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool ParseProcStats(const std::string& stats_data,
47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                    std::vector<std::string>* proc_stats);
48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Fields from /proc/<pid>/stat, 0-based. See man 5 proc.
50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// If the ordering ever changes, carefully review functions that use these
51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// values.
52b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratenum ProcStatsFields {
53b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VM_COMM           = 1,   // Filename of executable, without parentheses.
54b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VM_STATE          = 2,   // Letter indicating the state of the process.
55b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VM_PPID           = 3,   // PID of the parent.
56b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VM_PGRP           = 4,   // Process group id.
57b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VM_UTIME          = 13,  // Time scheduled in user mode in clock ticks.
58b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VM_STIME          = 14,  // Time scheduled in kernel mode in clock ticks.
59b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VM_NUMTHREADS     = 19,  // Number of threads.
60b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VM_STARTTIME      = 21,  // The time the process started in clock ticks.
61b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VM_VSIZE          = 22,  // Virtual memory size in bytes.
62b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VM_RSS            = 23,  // Resident Set Size in pages.
63b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
64b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
65b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Reads the |field_num|th field from |proc_stats|. Returns 0 on failure.
66b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// This version does not handle the first 3 values, since the first value is
67b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// simply |pid|, and the next two values are strings.
68cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkoint64_t GetProcStatsFieldAsInt64(const std::vector<std::string>& proc_stats,
69cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko                                 ProcStatsFields field_num);
70b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
71b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Same as GetProcStatsFieldAsInt64(), but for size_t values.
72b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratsize_t GetProcStatsFieldAsSizeT(const std::vector<std::string>& proc_stats,
73b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                ProcStatsFields field_num);
74b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
753a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli// Convenience wrappers around GetProcStatsFieldAsInt64(), ParseProcStats() and
76b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// ReadProcStats(). See GetProcStatsFieldAsInt64() for details.
773a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelliint64_t ReadStatsFilendGetFieldAsInt64(const FilePath& stat_file,
783a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli                                       ProcStatsFields field_num);
79cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkoint64_t ReadProcStatsAndGetFieldAsInt64(pid_t pid, ProcStatsFields field_num);
803a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelliint64_t ReadProcSelfStatsAndGetFieldAsInt64(ProcStatsFields field_num);
81b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
82b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Same as ReadProcStatsAndGetFieldAsInt64() but for size_t values.
83b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratsize_t ReadProcStatsAndGetFieldAsSizeT(pid_t pid,
84b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                       ProcStatsFields field_num);
85b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
86b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Returns the time that the OS started. Clock ticks are relative to this.
87b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTime GetBootTime();
88b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
893a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli// Returns the amount of time spent in user space since boot across all CPUs.
903a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay CivelliTimeDelta GetUserCpuTimeSinceBoot();
913a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli
92b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Converts Linux clock ticks to a wall time delta.
93b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTimeDelta ClockTicksToTimeDelta(int clock_ticks);
94b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
95b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace internal
96b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace base
97b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
98b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif  // BASE_PROCESS_INTERNAL_LINUX_H_
99