1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker // This file contains internal routines that are called by other files in
6*6777b538SAndroid Build Coastguard Worker // base/process/.
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard Worker #ifndef BASE_PROCESS_INTERNAL_LINUX_H_
9*6777b538SAndroid Build Coastguard Worker #define BASE_PROCESS_INTERNAL_LINUX_H_
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
12*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
13*6777b538SAndroid Build Coastguard Worker #include <unistd.h>
14*6777b538SAndroid Build Coastguard Worker
15*6777b538SAndroid Build Coastguard Worker #include <optional>
16*6777b538SAndroid Build Coastguard Worker #include <string>
17*6777b538SAndroid Build Coastguard Worker #include <string_view>
18*6777b538SAndroid Build Coastguard Worker #include <vector>
19*6777b538SAndroid Build Coastguard Worker
20*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/files/dir_reader_posix.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/process/process_handle.h"
24*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
25*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_split.h"
26*6777b538SAndroid Build Coastguard Worker #include "base/threading/platform_thread.h"
27*6777b538SAndroid Build Coastguard Worker
28*6777b538SAndroid Build Coastguard Worker namespace base {
29*6777b538SAndroid Build Coastguard Worker
30*6777b538SAndroid Build Coastguard Worker class Time;
31*6777b538SAndroid Build Coastguard Worker class TimeDelta;
32*6777b538SAndroid Build Coastguard Worker
33*6777b538SAndroid Build Coastguard Worker namespace internal {
34*6777b538SAndroid Build Coastguard Worker
35*6777b538SAndroid Build Coastguard Worker // "/proc"
36*6777b538SAndroid Build Coastguard Worker extern const char kProcDir[];
37*6777b538SAndroid Build Coastguard Worker
38*6777b538SAndroid Build Coastguard Worker // "stat"
39*6777b538SAndroid Build Coastguard Worker extern const char kStatFile[];
40*6777b538SAndroid Build Coastguard Worker
41*6777b538SAndroid Build Coastguard Worker // Returns a FilePath to "/proc/pid".
42*6777b538SAndroid Build Coastguard Worker BASE_EXPORT base::FilePath GetProcPidDir(pid_t pid);
43*6777b538SAndroid Build Coastguard Worker
44*6777b538SAndroid Build Coastguard Worker // Reads a file from /proc into a string. This is allowed on any thread as
45*6777b538SAndroid Build Coastguard Worker // reading from /proc does not hit the disk. Returns true if the file can be
46*6777b538SAndroid Build Coastguard Worker // read and is non-empty.
47*6777b538SAndroid Build Coastguard Worker bool ReadProcFile(const FilePath& file, std::string* buffer);
48*6777b538SAndroid Build Coastguard Worker
49*6777b538SAndroid Build Coastguard Worker // Take a /proc directory entry named |d_name|, and if it is the directory for
50*6777b538SAndroid Build Coastguard Worker // a process, convert it to a pid_t.
51*6777b538SAndroid Build Coastguard Worker // Returns 0 on failure.
52*6777b538SAndroid Build Coastguard Worker // e.g. /proc/self/ will return 0, whereas /proc/1234 will return 1234.
53*6777b538SAndroid Build Coastguard Worker pid_t ProcDirSlotToPid(const char* d_name);
54*6777b538SAndroid Build Coastguard Worker
55*6777b538SAndroid Build Coastguard Worker // Read |filename| in /proc/<pid>/, split the entries into key/value pairs, and
56*6777b538SAndroid Build Coastguard Worker // trim the key and value. On success, return true and write the trimmed
57*6777b538SAndroid Build Coastguard Worker // key/value pairs into |key_value_pairs|.
58*6777b538SAndroid Build Coastguard Worker bool ReadProcFileToTrimmedStringPairs(pid_t pid,
59*6777b538SAndroid Build Coastguard Worker std::string_view filename,
60*6777b538SAndroid Build Coastguard Worker StringPairs* key_value_pairs);
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard Worker // Read /proc/<pid>/status and return the value for |field|, or 0 on failure.
63*6777b538SAndroid Build Coastguard Worker // Only works for fields in the form of "Field: value kB".
64*6777b538SAndroid Build Coastguard Worker size_t ReadProcStatusAndGetKbFieldAsSizeT(pid_t pid, std::string_view field);
65*6777b538SAndroid Build Coastguard Worker
66*6777b538SAndroid Build Coastguard Worker // Read /proc/<pid>/status and look for |field|. On success, return true and
67*6777b538SAndroid Build Coastguard Worker // write the value for |field| into |result|.
68*6777b538SAndroid Build Coastguard Worker // Only works for fields in the form of "field : uint_value"
69*6777b538SAndroid Build Coastguard Worker bool ReadProcStatusAndGetFieldAsUint64(pid_t pid,
70*6777b538SAndroid Build Coastguard Worker std::string_view field,
71*6777b538SAndroid Build Coastguard Worker uint64_t* result);
72*6777b538SAndroid Build Coastguard Worker
73*6777b538SAndroid Build Coastguard Worker // Reads /proc/<pid>/stat into |buffer|. Returns true if the file can be read
74*6777b538SAndroid Build Coastguard Worker // and is non-empty.
75*6777b538SAndroid Build Coastguard Worker bool ReadProcStats(pid_t pid, std::string* buffer);
76*6777b538SAndroid Build Coastguard Worker
77*6777b538SAndroid Build Coastguard Worker // Takes |stats_data| and populates |proc_stats| with the values split by
78*6777b538SAndroid Build Coastguard Worker // spaces. Taking into account the 2nd field may, in itself, contain spaces.
79*6777b538SAndroid Build Coastguard Worker // Returns true if successful.
80*6777b538SAndroid Build Coastguard Worker bool ParseProcStats(const std::string& stats_data,
81*6777b538SAndroid Build Coastguard Worker std::vector<std::string>* proc_stats);
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker // Fields from /proc/<pid>/stat, 0-based. See man 5 proc.
84*6777b538SAndroid Build Coastguard Worker // If the ordering ever changes, carefully review functions that use these
85*6777b538SAndroid Build Coastguard Worker // values.
86*6777b538SAndroid Build Coastguard Worker enum ProcStatsFields {
87*6777b538SAndroid Build Coastguard Worker VM_COMM = 1, // Filename of executable, without parentheses.
88*6777b538SAndroid Build Coastguard Worker VM_STATE = 2, // Letter indicating the state of the process.
89*6777b538SAndroid Build Coastguard Worker VM_PPID = 3, // PID of the parent.
90*6777b538SAndroid Build Coastguard Worker VM_PGRP = 4, // Process group id.
91*6777b538SAndroid Build Coastguard Worker VM_MINFLT = 9, // Minor page fault count excluding children.
92*6777b538SAndroid Build Coastguard Worker VM_MAJFLT = 11, // Major page fault count excluding children.
93*6777b538SAndroid Build Coastguard Worker VM_UTIME = 13, // Time scheduled in user mode in clock ticks.
94*6777b538SAndroid Build Coastguard Worker VM_STIME = 14, // Time scheduled in kernel mode in clock ticks.
95*6777b538SAndroid Build Coastguard Worker VM_NUMTHREADS = 19, // Number of threads.
96*6777b538SAndroid Build Coastguard Worker VM_STARTTIME = 21, // The time the process started in clock ticks.
97*6777b538SAndroid Build Coastguard Worker VM_VSIZE = 22, // Virtual memory size in bytes.
98*6777b538SAndroid Build Coastguard Worker VM_RSS = 23, // Resident Set Size in pages.
99*6777b538SAndroid Build Coastguard Worker };
100*6777b538SAndroid Build Coastguard Worker
101*6777b538SAndroid Build Coastguard Worker // Reads the |field_num|th field from |proc_stats|. Returns 0 on failure.
102*6777b538SAndroid Build Coastguard Worker // This version does not handle the first 3 values, since the first value is
103*6777b538SAndroid Build Coastguard Worker // simply |pid|, and the next two values are strings.
104*6777b538SAndroid Build Coastguard Worker int64_t GetProcStatsFieldAsInt64(const std::vector<std::string>& proc_stats,
105*6777b538SAndroid Build Coastguard Worker ProcStatsFields field_num);
106*6777b538SAndroid Build Coastguard Worker
107*6777b538SAndroid Build Coastguard Worker // Reads the `field_num`th field from `proc_stats`. Asserts that `field_num` is
108*6777b538SAndroid Build Coastguard Worker // a valid index into `proc_stats`. Returns nullopt if the field doesn't contain
109*6777b538SAndroid Build Coastguard Worker // a valid integer.
110*6777b538SAndroid Build Coastguard Worker std::optional<int64_t> GetProcStatsFieldAsOptionalInt64(
111*6777b538SAndroid Build Coastguard Worker base::span<const std::string> proc_stats,
112*6777b538SAndroid Build Coastguard Worker ProcStatsFields field_num);
113*6777b538SAndroid Build Coastguard Worker
114*6777b538SAndroid Build Coastguard Worker // Same as GetProcStatsFieldAsInt64(), but for size_t values.
115*6777b538SAndroid Build Coastguard Worker size_t GetProcStatsFieldAsSizeT(const std::vector<std::string>& proc_stats,
116*6777b538SAndroid Build Coastguard Worker ProcStatsFields field_num);
117*6777b538SAndroid Build Coastguard Worker
118*6777b538SAndroid Build Coastguard Worker // Convenience wrappers around GetProcStatsFieldAsInt64(), ParseProcStats() and
119*6777b538SAndroid Build Coastguard Worker // ReadProcStats(). See GetProcStatsFieldAsInt64() for details.
120*6777b538SAndroid Build Coastguard Worker int64_t ReadStatsFilendGetFieldAsInt64(const FilePath& stat_file,
121*6777b538SAndroid Build Coastguard Worker ProcStatsFields field_num);
122*6777b538SAndroid Build Coastguard Worker int64_t ReadProcStatsAndGetFieldAsInt64(pid_t pid, ProcStatsFields field_num);
123*6777b538SAndroid Build Coastguard Worker int64_t ReadProcSelfStatsAndGetFieldAsInt64(ProcStatsFields field_num);
124*6777b538SAndroid Build Coastguard Worker
125*6777b538SAndroid Build Coastguard Worker // Same as ReadProcStatsAndGetFieldAsInt64() but for size_t values.
126*6777b538SAndroid Build Coastguard Worker size_t ReadProcStatsAndGetFieldAsSizeT(pid_t pid,
127*6777b538SAndroid Build Coastguard Worker ProcStatsFields field_num);
128*6777b538SAndroid Build Coastguard Worker
129*6777b538SAndroid Build Coastguard Worker // Returns the time that the OS started. Clock ticks are relative to this.
130*6777b538SAndroid Build Coastguard Worker Time GetBootTime();
131*6777b538SAndroid Build Coastguard Worker
132*6777b538SAndroid Build Coastguard Worker // Returns the amount of time spent in user space since boot across all CPUs.
133*6777b538SAndroid Build Coastguard Worker TimeDelta GetUserCpuTimeSinceBoot();
134*6777b538SAndroid Build Coastguard Worker
135*6777b538SAndroid Build Coastguard Worker // Converts Linux clock ticks to a wall time delta.
136*6777b538SAndroid Build Coastguard Worker TimeDelta ClockTicksToTimeDelta(int64_t clock_ticks);
137*6777b538SAndroid Build Coastguard Worker
138*6777b538SAndroid Build Coastguard Worker // Executes the lambda for every task in the process's /proc/<pid>/task
139*6777b538SAndroid Build Coastguard Worker // directory. The thread id and file path of the task directory are provided as
140*6777b538SAndroid Build Coastguard Worker // arguments to the lambda.
141*6777b538SAndroid Build Coastguard Worker template <typename Lambda>
ForEachProcessTask(base::ProcessHandle process,Lambda && lambda)142*6777b538SAndroid Build Coastguard Worker void ForEachProcessTask(base::ProcessHandle process, Lambda&& lambda) {
143*6777b538SAndroid Build Coastguard Worker // Iterate through the different threads tracked in /proc/<pid>/task.
144*6777b538SAndroid Build Coastguard Worker FilePath fd_path = GetProcPidDir(process).Append("task");
145*6777b538SAndroid Build Coastguard Worker
146*6777b538SAndroid Build Coastguard Worker DirReaderPosix dir_reader(fd_path.value().c_str());
147*6777b538SAndroid Build Coastguard Worker if (!dir_reader.IsValid())
148*6777b538SAndroid Build Coastguard Worker return;
149*6777b538SAndroid Build Coastguard Worker
150*6777b538SAndroid Build Coastguard Worker for (; dir_reader.Next();) {
151*6777b538SAndroid Build Coastguard Worker const char* tid_str = dir_reader.name();
152*6777b538SAndroid Build Coastguard Worker if (strcmp(tid_str, ".") == 0 || strcmp(tid_str, "..") == 0)
153*6777b538SAndroid Build Coastguard Worker continue;
154*6777b538SAndroid Build Coastguard Worker
155*6777b538SAndroid Build Coastguard Worker PlatformThreadId tid;
156*6777b538SAndroid Build Coastguard Worker if (!StringToInt(tid_str, &tid))
157*6777b538SAndroid Build Coastguard Worker continue;
158*6777b538SAndroid Build Coastguard Worker
159*6777b538SAndroid Build Coastguard Worker FilePath task_path = fd_path.Append(tid_str);
160*6777b538SAndroid Build Coastguard Worker lambda(tid, task_path);
161*6777b538SAndroid Build Coastguard Worker }
162*6777b538SAndroid Build Coastguard Worker }
163*6777b538SAndroid Build Coastguard Worker
164*6777b538SAndroid Build Coastguard Worker } // namespace internal
165*6777b538SAndroid Build Coastguard Worker } // namespace base
166*6777b538SAndroid Build Coastguard Worker
167*6777b538SAndroid Build Coastguard Worker #endif // BASE_PROCESS_INTERNAL_LINUX_H_
168