process_metrics.h revision 94ffa55491333f3dcc701befd0d2652922916d99
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 routines for gathering resource statistics for processes
6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// running on the system.
7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#ifndef BASE_PROCESS_PROCESS_METRICS_H_
9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define BASE_PROCESS_PROCESS_METRICS_H_
10b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
110d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include <stddef.h>
120d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include <stdint.h>
130d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <string>
15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/base_export.h"
17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/gtest_prod_util.h"
180d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/macros.h"
19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/process/process_handle.h"
20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/time/time.h"
21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/values.h"
220d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "build/build_config.h"
23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_MACOSX)
25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <mach/mach.h>
260d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/process/port_provider_mac.h"
27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif
28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base {
30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_WIN)
32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstruct IoCounters : public IO_COUNTERS {
33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#elif defined(OS_POSIX)
35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstruct IoCounters {
36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  uint64_t ReadOperationCount;
37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  uint64_t WriteOperationCount;
38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  uint64_t OtherOperationCount;
39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  uint64_t ReadTransferCount;
40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  uint64_t WriteTransferCount;
41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  uint64_t OtherTransferCount;
42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif
44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Working Set (resident) memory usage broken down by
46b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat//
47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// On Windows:
48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// priv (private): These pages (kbytes) cannot be shared with any other process.
49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// shareable:      These pages (kbytes) can be shared with other processes under
50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat//                 the right circumstances.
51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// shared :        These pages (kbytes) are currently shared with at least one
52b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat//                 other process.
53b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat//
54b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// On Linux:
55b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// priv:           Pages mapped only by this process.
56b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// shared:         PSS or 0 if the kernel doesn't support this.
57b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// shareable:      0
58b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
59b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// On ChromeOS:
60b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// priv:           Pages mapped only by this process.
61b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// shared:         PSS or 0 if the kernel doesn't support this.
62b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// shareable:      0
63b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// swapped         Pages swapped out to zram.
64b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat//
65b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// On OS X: TODO(thakis): Revise.
66b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// priv:           Memory.
67b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// shared:         0
68b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// shareable:      0
69b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat//
70b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstruct WorkingSetKBytes {
71b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  WorkingSetKBytes() : priv(0), shareable(0), shared(0) {}
72b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t priv;
73b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t shareable;
74b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t shared;
75b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_CHROMEOS)
76b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t swapped;
77b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif
78b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
79b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
80b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Committed (resident + paged) memory usage broken down by
81b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// private: These pages cannot be shared with any other process.
82b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// mapped:  These pages are mapped into the view of a section (backed by
83b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat//          pagefile.sys)
84b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// image:   These pages are mapped into the view of an image section (backed by
85b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat//          file system)
86b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstruct CommittedKBytes {
87b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  CommittedKBytes() : priv(0), mapped(0), image(0) {}
88b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t priv;
89b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t mapped;
90b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t image;
91b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
92b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
93b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Convert a POSIX timeval to microseconds.
940d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoBASE_EXPORT int64_t TimeValToMicroseconds(const struct timeval& tv);
95b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
96b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Provides performance metrics for a specified process (CPU usage, memory and
970d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// IO counters). Use CreateCurrentProcessMetrics() to get an instance for the
980d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// current process, or CreateProcessMetrics() to get an instance for an
990d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// arbitrary process. Then, access the information with the different get
100b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// methods.
101b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass BASE_EXPORT ProcessMetrics {
102b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public:
103b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ~ProcessMetrics();
104b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
105b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Creates a ProcessMetrics for the specified process.
106b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // The caller owns the returned object.
107b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if !defined(OS_MACOSX) || defined(OS_IOS)
108b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static ProcessMetrics* CreateProcessMetrics(ProcessHandle process);
109b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#else
110b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
111b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // The port provider needs to outlive the ProcessMetrics object returned by
112b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // this function. If NULL is passed as provider, the returned object
113b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // only returns valid metrics if |process| is the current process.
114b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static ProcessMetrics* CreateProcessMetrics(ProcessHandle process,
115b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                              PortProvider* port_provider);
116b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif  // !defined(OS_MACOSX) || defined(OS_IOS)
117b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1180d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  // Creates a ProcessMetrics for the current process. This a cross-platform
1190d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  // convenience wrapper for CreateProcessMetrics().
1200d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  // The caller owns the returned object.
1210d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  static ProcessMetrics* CreateCurrentProcessMetrics();
1220d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
123b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Returns the current space allocated for the pagefile, in bytes (these pages
124b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // may or may not be in memory).  On Linux, this returns the total virtual
125b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // memory size.
126b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t GetPagefileUsage() const;
127b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Returns the peak space allocated for the pagefile, in bytes.
128b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t GetPeakPagefileUsage() const;
129b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Returns the current working set size, in bytes.  On Linux, this returns
130b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // the resident set size.
131b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t GetWorkingSetSize() const;
132b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Returns the peak working set size, in bytes.
133b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t GetPeakWorkingSetSize() const;
134b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Returns private and sharedusage, in bytes. Private bytes is the amount of
135b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // memory currently allocated to a process that cannot be shared. Returns
136b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // false on platform specific error conditions.  Note: |private_bytes|
137b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // returns 0 on unsupported OSes: prior to XP SP2.
138b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  bool GetMemoryBytes(size_t* private_bytes,
139b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                      size_t* shared_bytes);
140b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Fills a CommittedKBytes with both resident and paged
141b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // memory usage as per definition of CommittedBytes.
142b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void GetCommittedKBytes(CommittedKBytes* usage) const;
143b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Fills a WorkingSetKBytes containing resident private and shared memory
1440d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  // usage in bytes, as per definition of WorkingSetBytes. Note that this
1450d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  // function is somewhat expensive on Windows (a few ms per process).
146b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  bool GetWorkingSetKBytes(WorkingSetKBytes* ws_usage) const;
147b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
148b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_MACOSX)
149b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Fills both CommitedKBytes and WorkingSetKBytes in a single operation. This
150b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // is more efficient on Mac OS X, as the two can be retrieved with a single
151b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // system call.
152b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  bool GetCommittedAndWorkingSetKBytes(CommittedKBytes* usage,
153b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                       WorkingSetKBytes* ws_usage) const;
154b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif
155b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
156b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Returns the CPU usage in percent since the last time this method or
157b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // GetPlatformIndependentCPUUsage() was called. The first time this method
158b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // is called it returns 0 and will return the actual CPU info on subsequent
159b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // calls. On Windows, the CPU usage value is for all CPUs. So if you have
160b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // 2 CPUs and your process is using all the cycles of 1 CPU and not the other
161b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // CPU, this method returns 50.
162b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  double GetCPUUsage();
163b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
164b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Returns the number of average idle cpu wakeups per second since the last
165b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // call.
166b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int GetIdleWakeupsPerSecond();
167b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
168b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Same as GetCPUUsage(), but will return consistent values on all platforms
169b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // (cancelling the Windows exception mentioned above) by returning a value in
170b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // the range of 0 to (100 * numCPUCores) everywhere.
171b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  double GetPlatformIndependentCPUUsage();
172b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
173b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Retrieves accounting information for all I/O operations performed by the
174b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // process.
175b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // If IO information is retrieved successfully, the function returns true
176b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // and fills in the IO_COUNTERS passed in. The function returns false
177b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // otherwise.
178b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  bool GetIOCounters(IoCounters* io_counters) const;
179b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1800d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if defined(OS_LINUX)
1810d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  // Returns the number of file descriptors currently open by the process, or
1820d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  // -1 on error.
1830d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  int GetOpenFdCount() const;
1840d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#endif  // defined(OS_LINUX)
1850d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
186b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private:
187b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if !defined(OS_MACOSX) || defined(OS_IOS)
188b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  explicit ProcessMetrics(ProcessHandle process);
189b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#else
190b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ProcessMetrics(ProcessHandle process, PortProvider* port_provider);
191b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif  // !defined(OS_MACOSX) || defined(OS_IOS)
192b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
193b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_LINUX) || defined(OS_ANDROID)
194b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  bool GetWorkingSetKBytesStatm(WorkingSetKBytes* ws_usage) const;
195b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif
196b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
197b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_CHROMEOS)
198b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  bool GetWorkingSetKBytesTotmaps(WorkingSetKBytes *ws_usage) const;
199b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif
200b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
201b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_MACOSX) || defined(OS_LINUX)
2020d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  int CalculateIdleWakeupsPerSecond(uint64_t absolute_idle_wakeups);
203b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif
204b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
205b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ProcessHandle process_;
206b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
207b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int processor_count_;
208b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
209b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Used to store the previous times and CPU usage counts so we can
210b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // compute the CPU usage between calls.
211b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TimeTicks last_cpu_time_;
2120d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  int64_t last_system_time_;
213b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
214b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_MACOSX) || defined(OS_LINUX)
215b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Same thing for idle wakeups.
216b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TimeTicks last_idle_wakeups_time_;
2170d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t last_absolute_idle_wakeups_;
218b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif
219b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
220b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if !defined(OS_IOS)
221b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_MACOSX)
222b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Queries the port provider if it's set.
223b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  mach_port_t TaskForPid(ProcessHandle process) const;
224b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
225b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  PortProvider* port_provider_;
226b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#elif defined(OS_POSIX)
227b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Jiffie count at the last_cpu_time_ we updated.
228b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int last_cpu_;
229b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif  // defined(OS_POSIX)
230b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif  // !defined(OS_IOS)
231b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
232b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DISALLOW_COPY_AND_ASSIGN(ProcessMetrics);
233b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
234b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
235b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Returns the memory committed by the system in KBytes.
236b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Returns 0 if it can't compute the commit charge.
237b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT size_t GetSystemCommitCharge();
238b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
23994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// Returns the number of bytes in a memory page. Do not use this to compute
24094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// the number of pages in a block of memory for calling mincore(). On some
24194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// platforms, e.g. iOS, mincore() uses a different page size from what is
24294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// returned by GetPageSize().
243b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT size_t GetPageSize();
244b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
245b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_POSIX)
246b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Returns the maximum number of file descriptors that can be open by a process
247b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// at once. If the number is unavailable, a conservative best guess is returned.
248b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT size_t GetMaxFds();
249b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
250b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Sets the file descriptor soft limit to |max_descriptors| or the OS hard
251b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// limit, whichever is lower.
252b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT void SetFdLimit(unsigned int max_descriptors);
253b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif  // defined(OS_POSIX)
254b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2550d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
2560d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko    defined(OS_ANDROID)
2570d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Data about system-wide memory consumption. Values are in KB. Available on
2580d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Windows, Mac, Linux, Android and Chrome OS.
2590d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko//
2600d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Total/free memory are available on all platforms that implement
2610d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// GetSystemMemoryInfo(). Total/free swap memory are available on all platforms
2620d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// except on Mac. Buffers/cached/active_anon/inactive_anon/active_file/
2630d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// inactive_file/dirty/pswpin/pswpout/pgmajfault are available on
2640d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Linux/Android/Chrome OS. Shmem/slab/gem_objects/gem_size are Chrome OS only.
265b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstruct BASE_EXPORT SystemMemoryInfoKB {
266b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  SystemMemoryInfoKB();
26745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko  SystemMemoryInfoKB(const SystemMemoryInfoKB& other);
268b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
269b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Serializes the platform specific fields to value.
27094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<Value> ToValue() const;
271b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
272b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int total;
273b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int free;
2740d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
2750d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if !defined(OS_MACOSX)
2760d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  int swap_total;
2770d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  int swap_free;
2780d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#endif
2790d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
2800d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if defined(OS_ANDROID) || defined(OS_LINUX)
281b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int buffers;
282b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int cached;
283b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int active_anon;
284b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int inactive_anon;
285b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int active_file;
286b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int inactive_file;
287b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int dirty;
288b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
289b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // vmstats data.
290b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int pswpin;
291b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int pswpout;
292b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int pgmajfault;
2930d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#endif  // defined(OS_ANDROID) || defined(OS_LINUX)
294b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2950d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if defined(OS_CHROMEOS)
296b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int shmem;
297b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int slab;
298b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Gem data will be -1 if not supported.
299b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int gem_objects;
300b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  long long gem_size;
3010d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#endif  // defined(OS_CHROMEOS)
302b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
303b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
3040d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// On Linux/Android/Chrome OS, system-wide memory consumption data is parsed
3050d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// from /proc/meminfo and /proc/vmstat. On Windows/Mac, it is obtained using
3060d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// system API calls.
3070d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko//
3080d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Fills in the provided |meminfo| structure. Returns true on success.
3090d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Exposed for memory debugging widget.
3100d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoBASE_EXPORT bool GetSystemMemoryInfo(SystemMemoryInfoKB* meminfo);
3110d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
3120d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#endif  // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
3130d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko        // defined(OS_ANDROID)
3140d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
3150d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if defined(OS_LINUX) || defined(OS_ANDROID)
3160d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Parse the data found in /proc/<pid>/stat and return the sum of the
3170d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// CPU-related ticks.  Returns -1 on parse error.
3180d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Exposed for testing.
3190d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoBASE_EXPORT int ParseProcStatCPU(const std::string& input);
3200d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
3210d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Get the number of threads of |process| as available in /proc/<pid>/stat.
3220d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// This should be used with care as no synchronization with running threads is
3230d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// done. This is mostly useful to guarantee being single-threaded.
3240d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Returns 0 on failure.
3250d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoBASE_EXPORT int GetNumberOfThreads(ProcessHandle process);
3260d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
3270d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// /proc/self/exe refers to the current executable.
3280d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoBASE_EXPORT extern const char kProcSelfExe[];
3290d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
330b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Parses a string containing the contents of /proc/meminfo
331b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// returns true on success or false for a parsing error
332b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT bool ParseProcMeminfo(const std::string& input,
333b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                  SystemMemoryInfoKB* meminfo);
334b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
335b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Parses a string containing the contents of /proc/vmstat
336b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// returns true on success or false for a parsing error
337b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT bool ParseProcVmstat(const std::string& input,
338b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                 SystemMemoryInfoKB* meminfo);
339b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
340b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Data from /proc/diskstats about system-wide disk I/O.
341b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstruct BASE_EXPORT SystemDiskInfo {
342b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  SystemDiskInfo();
34345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko  SystemDiskInfo(const SystemDiskInfo& other);
344b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
345b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Serializes the platform specific fields to value.
34694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<Value> ToValue() const;
347b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
3480d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t reads;
3490d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t reads_merged;
3500d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t sectors_read;
3510d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t read_time;
3520d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t writes;
3530d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t writes_merged;
3540d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t sectors_written;
3550d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t write_time;
3560d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t io;
3570d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t io_time;
3580d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t weighted_io_time;
359b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
360b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
361b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Checks whether the candidate string is a valid disk name, [hsv]d[a-z]+
362b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// for a generic disk or mmcblk[0-9]+ for the MMC case.
363b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Names of disk partitions (e.g. sda1) are not valid.
364b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT bool IsValidDiskName(const std::string& candidate);
365b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
366b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Retrieves data from /proc/diskstats about system-wide disk I/O.
367b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Fills in the provided |diskinfo| structure. Returns true on success.
368b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT bool GetSystemDiskInfo(SystemDiskInfo* diskinfo);
369b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif  // defined(OS_LINUX) || defined(OS_ANDROID)
370b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
371b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_CHROMEOS)
372b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Data from files in directory /sys/block/zram0 about ZRAM usage.
373b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstruct BASE_EXPORT SwapInfo {
374b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  SwapInfo()
375b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      : num_reads(0),
376b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        num_writes(0),
377b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        compr_data_size(0),
378b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        orig_data_size(0),
379b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        mem_used_total(0) {
380b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
381b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
382b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Serializes the platform specific fields to value.
38394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<Value> ToValue() const;
384b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
3850d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t num_reads;
3860d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t num_writes;
3870d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t compr_data_size;
3880d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t orig_data_size;
3890d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t mem_used_total;
390b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
391b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
392b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// In ChromeOS, reads files from /sys/block/zram0 that contain ZRAM usage data.
393b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Fills in the provided |swap_data| structure.
394b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT void GetSwapInfo(SwapInfo* swap_info);
395b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif  // defined(OS_CHROMEOS)
396b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
397b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Collects and holds performance metrics for system memory and disk.
398b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Provides functionality to retrieve the data on various platforms and
399b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// to serialize the stored data.
400b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass SystemMetrics {
401b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public:
402b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  SystemMetrics();
403b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
404b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static SystemMetrics Sample();
405b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
406b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Serializes the system metrics to value.
40794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<Value> ToValue() const;
408b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
409b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private:
410b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  FRIEND_TEST_ALL_PREFIXES(SystemMetricsTest, SystemMetrics);
411b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
412b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t committed_memory_;
413b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_LINUX) || defined(OS_ANDROID)
414b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  SystemMemoryInfoKB memory_info_;
415b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  SystemDiskInfo disk_info_;
416b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif
417b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_CHROMEOS)
418b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  SwapInfo swap_info_;
419b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif
420b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
421b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
422b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace base
423b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
424b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif  // BASE_PROCESS_PROCESS_METRICS_H_
425