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
2750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez#if defined(OS_LINUX)
2760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  // This provides an estimate of available memory as described here:
2770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  // https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773
2780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  // NOTE: this is ONLY valid in kernels 3.14 and up.  Its value will always
2790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  // be 0 in earlier kernel versions.
2800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  int available;
2810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez#endif
2820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2830d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if !defined(OS_MACOSX)
2840d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  int swap_total;
2850d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  int swap_free;
2860d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#endif
2870d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
2880d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if defined(OS_ANDROID) || defined(OS_LINUX)
289b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int buffers;
290b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int cached;
291b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int active_anon;
292b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int inactive_anon;
293b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int active_file;
294b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int inactive_file;
295b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int dirty;
296b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
297b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // vmstats data.
298b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int pswpin;
299b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int pswpout;
300b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int pgmajfault;
3010d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#endif  // defined(OS_ANDROID) || defined(OS_LINUX)
302b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
3030d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if defined(OS_CHROMEOS)
304b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int shmem;
305b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int slab;
306b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Gem data will be -1 if not supported.
307b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int gem_objects;
308b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  long long gem_size;
3090d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#endif  // defined(OS_CHROMEOS)
310b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
311b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
3120d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// On Linux/Android/Chrome OS, system-wide memory consumption data is parsed
3130d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// from /proc/meminfo and /proc/vmstat. On Windows/Mac, it is obtained using
3140d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// system API calls.
3150d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko//
3160d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Fills in the provided |meminfo| structure. Returns true on success.
3170d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Exposed for memory debugging widget.
3180d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoBASE_EXPORT bool GetSystemMemoryInfo(SystemMemoryInfoKB* meminfo);
3190d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
3200d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#endif  // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
3210d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko        // defined(OS_ANDROID)
3220d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
3230d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if defined(OS_LINUX) || defined(OS_ANDROID)
3240d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Parse the data found in /proc/<pid>/stat and return the sum of the
3250d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// CPU-related ticks.  Returns -1 on parse error.
3260d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Exposed for testing.
3270d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoBASE_EXPORT int ParseProcStatCPU(const std::string& input);
3280d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
3290d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Get the number of threads of |process| as available in /proc/<pid>/stat.
3300d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// This should be used with care as no synchronization with running threads is
3310d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// done. This is mostly useful to guarantee being single-threaded.
3320d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Returns 0 on failure.
3330d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoBASE_EXPORT int GetNumberOfThreads(ProcessHandle process);
3340d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
3350d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// /proc/self/exe refers to the current executable.
3360d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoBASE_EXPORT extern const char kProcSelfExe[];
3370d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
338b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Parses a string containing the contents of /proc/meminfo
339b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// returns true on success or false for a parsing error
340b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT bool ParseProcMeminfo(const std::string& input,
341b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                  SystemMemoryInfoKB* meminfo);
342b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
343b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Parses a string containing the contents of /proc/vmstat
344b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// returns true on success or false for a parsing error
345b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT bool ParseProcVmstat(const std::string& input,
346b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                 SystemMemoryInfoKB* meminfo);
347b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
348b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Data from /proc/diskstats about system-wide disk I/O.
349b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstruct BASE_EXPORT SystemDiskInfo {
350b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  SystemDiskInfo();
35145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko  SystemDiskInfo(const SystemDiskInfo& other);
352b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
353b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Serializes the platform specific fields to value.
35494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<Value> ToValue() const;
355b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
3560d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t reads;
3570d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t reads_merged;
3580d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t sectors_read;
3590d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t read_time;
3600d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t writes;
3610d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t writes_merged;
3620d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t sectors_written;
3630d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t write_time;
3640d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t io;
3650d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t io_time;
3660d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t weighted_io_time;
367b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
368b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
369b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Checks whether the candidate string is a valid disk name, [hsv]d[a-z]+
370b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// for a generic disk or mmcblk[0-9]+ for the MMC case.
371b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Names of disk partitions (e.g. sda1) are not valid.
372b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT bool IsValidDiskName(const std::string& candidate);
373b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
374b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Retrieves data from /proc/diskstats about system-wide disk I/O.
375b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Fills in the provided |diskinfo| structure. Returns true on success.
376b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT bool GetSystemDiskInfo(SystemDiskInfo* diskinfo);
377b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif  // defined(OS_LINUX) || defined(OS_ANDROID)
378b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
379b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_CHROMEOS)
380b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Data from files in directory /sys/block/zram0 about ZRAM usage.
381b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstruct BASE_EXPORT SwapInfo {
382b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  SwapInfo()
383b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      : num_reads(0),
384b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        num_writes(0),
385b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        compr_data_size(0),
386b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        orig_data_size(0),
387b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        mem_used_total(0) {
388b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
389b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
390b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Serializes the platform specific fields to value.
39194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<Value> ToValue() const;
392b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
3930d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t num_reads;
3940d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t num_writes;
3950d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t compr_data_size;
3960d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t orig_data_size;
3970d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  uint64_t mem_used_total;
398b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
399b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
400b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// In ChromeOS, reads files from /sys/block/zram0 that contain ZRAM usage data.
401b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Fills in the provided |swap_data| structure.
402b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT void GetSwapInfo(SwapInfo* swap_info);
403b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif  // defined(OS_CHROMEOS)
404b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
405b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Collects and holds performance metrics for system memory and disk.
406b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Provides functionality to retrieve the data on various platforms and
407b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// to serialize the stored data.
408b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass SystemMetrics {
409b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public:
410b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  SystemMetrics();
411b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
412b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static SystemMetrics Sample();
413b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
414b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Serializes the system metrics to value.
41594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  std::unique_ptr<Value> ToValue() const;
416b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
417b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private:
418b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  FRIEND_TEST_ALL_PREFIXES(SystemMetricsTest, SystemMetrics);
419b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
420b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t committed_memory_;
421b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_LINUX) || defined(OS_ANDROID)
422b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  SystemMemoryInfoKB memory_info_;
423b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  SystemDiskInfo disk_info_;
424b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif
425b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_CHROMEOS)
426b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  SwapInfo swap_info_;
427b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif
428b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
429b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
430b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace base
431b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
432b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif  // BASE_PROCESS_PROCESS_METRICS_H_
433