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