|  | // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | // This file contains routines for gathering resource statistics for processes | 
|  | // running on the system. | 
|  |  | 
|  | #ifndef BASE_PROCESS_PROCESS_METRICS_H_ | 
|  | #define BASE_PROCESS_PROCESS_METRICS_H_ | 
|  |  | 
|  | #include <stddef.h> | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include <memory> | 
|  | #include <string> | 
|  |  | 
|  | #include "base/base_export.h" | 
|  | #include "base/gtest_prod_util.h" | 
|  | #include "base/macros.h" | 
|  | #include "base/process/process_handle.h" | 
|  | #include "base/time/time.h" | 
|  | #include "base/values.h" | 
|  | #include "build_config.h" | 
|  |  | 
|  | #if defined(OS_MACOSX) | 
|  | #include <mach/mach.h> | 
|  | #include "base/process/port_provider_mac.h" | 
|  |  | 
|  | #if !defined(OS_IOS) | 
|  | #include <mach/mach_vm.h> | 
|  | #endif | 
|  | #endif | 
|  |  | 
|  | #if defined(OS_WIN) | 
|  | #include "base/win/scoped_handle.h" | 
|  | #include "base/win/windows_types.h" | 
|  | #endif | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | // Full declaration is in process_metrics_iocounters.h. | 
|  | struct IoCounters; | 
|  |  | 
|  | #if defined(OS_LINUX) || defined(OS_ANDROID) | 
|  | // Minor and major page fault counts since the process creation. | 
|  | // Both counts are process-wide, and exclude child processes. | 
|  | // | 
|  | // minor: Number of page faults that didn't require disk IO. | 
|  | // major: Number of page faults that required disk IO. | 
|  | struct PageFaultCounts { | 
|  | int64_t minor; | 
|  | int64_t major; | 
|  | }; | 
|  | #endif  // defined(OS_LINUX) || defined(OS_ANDROID) | 
|  |  | 
|  | // Convert a POSIX timeval to microseconds. | 
|  | BASE_EXPORT int64_t TimeValToMicroseconds(const struct timeval& tv); | 
|  |  | 
|  | // Provides performance metrics for a specified process (CPU usage and IO | 
|  | // counters). Use CreateCurrentProcessMetrics() to get an instance for the | 
|  | // current process, or CreateProcessMetrics() to get an instance for an | 
|  | // arbitrary process. Then, access the information with the different get | 
|  | // methods. | 
|  | // | 
|  | // This class exposes a few platform-specific APIs for parsing memory usage, but | 
|  | // these are not intended to generalize to other platforms, since the memory | 
|  | // models differ substantially. | 
|  | // | 
|  | // To obtain consistent memory metrics, use the memory_instrumentation service. | 
|  | // | 
|  | // For further documentation on memory, see | 
|  | // https://chromium.googlesource.com/chromium/src/+/HEAD/docs/README.md | 
|  | class BASE_EXPORT ProcessMetrics { | 
|  | public: | 
|  | ~ProcessMetrics(); | 
|  |  | 
|  | // Creates a ProcessMetrics for the specified process. | 
|  | #if !defined(OS_MACOSX) || defined(OS_IOS) | 
|  | static std::unique_ptr<ProcessMetrics> CreateProcessMetrics( | 
|  | ProcessHandle process); | 
|  | #else | 
|  |  | 
|  | // The port provider needs to outlive the ProcessMetrics object returned by | 
|  | // this function. If NULL is passed as provider, the returned object | 
|  | // only returns valid metrics if |process| is the current process. | 
|  | static std::unique_ptr<ProcessMetrics> CreateProcessMetrics( | 
|  | ProcessHandle process, | 
|  | PortProvider* port_provider); | 
|  | #endif  // !defined(OS_MACOSX) || defined(OS_IOS) | 
|  |  | 
|  | // Creates a ProcessMetrics for the current process. This a cross-platform | 
|  | // convenience wrapper for CreateProcessMetrics(). | 
|  | static std::unique_ptr<ProcessMetrics> CreateCurrentProcessMetrics(); | 
|  |  | 
|  | #if defined(OS_LINUX) || defined(OS_ANDROID) | 
|  | // Resident Set Size is a Linux/Android specific memory concept. Do not | 
|  | // attempt to extend this to other platforms. | 
|  | BASE_EXPORT size_t GetResidentSetSize() const; | 
|  | #endif | 
|  |  | 
|  | #if defined(OS_CHROMEOS) | 
|  | // /proc/<pid>/totmaps is a syscall that returns memory summary statistics for | 
|  | // the process. | 
|  | // totmaps is a Linux specific concept, currently only being used on ChromeOS. | 
|  | // Do not attempt to extend this to other platforms. | 
|  | // | 
|  | struct TotalsSummary { | 
|  | size_t private_clean_kb; | 
|  | size_t private_dirty_kb; | 
|  | size_t swap_kb; | 
|  | }; | 
|  | BASE_EXPORT TotalsSummary GetTotalsSummary() const; | 
|  | #endif | 
|  |  | 
|  | #if defined(OS_MACOSX) | 
|  | struct TaskVMInfo { | 
|  | // Only available on macOS 10.12+. | 
|  | // Anonymous, non-discardable memory, including non-volatile IOKit. | 
|  | // Measured in bytes. | 
|  | uint64_t phys_footprint = 0; | 
|  |  | 
|  | // Anonymous, non-discardable, non-compressed memory, excluding IOKit. | 
|  | // Measured in bytes. | 
|  | uint64_t internal = 0; | 
|  |  | 
|  | // Compressed memory measured in bytes. | 
|  | uint64_t compressed = 0; | 
|  | }; | 
|  | TaskVMInfo GetTaskVMInfo() const; | 
|  | #endif | 
|  |  | 
|  | // Returns the percentage of time spent executing, across all threads of the | 
|  | // process, in the interval since the last time the method was called. Since | 
|  | // this considers the total execution time across all threads in a process, | 
|  | // the result can easily exceed 100% in multi-thread processes running on | 
|  | // multi-core systems. In general the result is therefore a value in the | 
|  | // range 0% to SysInfo::NumberOfProcessors() * 100%. | 
|  | // | 
|  | // To obtain the percentage of total available CPU resources consumed by this | 
|  | // process over the interval, the caller must divide by NumberOfProcessors(). | 
|  | // | 
|  | // Since this API measures usage over an interval, it will return zero on the | 
|  | // first call, and an actual value only on the second and subsequent calls. | 
|  | double GetPlatformIndependentCPUUsage(); | 
|  |  | 
|  | // Returns the cumulative CPU usage across all threads of the process since | 
|  | // process start. In case of multi-core processors, a process can consume CPU | 
|  | // at a rate higher than wall-clock time, e.g. two cores at full utilization | 
|  | // will result in a time delta of 2 seconds/per 1 wall-clock second. | 
|  | TimeDelta GetCumulativeCPUUsage(); | 
|  |  | 
|  | // Returns the number of average idle cpu wakeups per second since the last | 
|  | // call. | 
|  | int GetIdleWakeupsPerSecond(); | 
|  |  | 
|  | #if defined(OS_MACOSX) | 
|  | // Returns the number of average "package idle exits" per second, which have | 
|  | // a higher energy impact than a regular wakeup, since the last call. | 
|  | // | 
|  | // From the powermetrics man page: | 
|  | // "With the exception of some Mac Pro systems, Mac and | 
|  | // iOS systems are typically single package systems, wherein all CPUs are | 
|  | // part of a single processor complex (typically a single IC die) with shared | 
|  | // logic that can include (depending on system specifics) shared last level | 
|  | // caches, an integrated memory controller etc. When all CPUs in the package | 
|  | // are idle, the hardware can power-gate significant portions of the shared | 
|  | // logic in addition to each individual processor's logic, as well as take | 
|  | // measures such as placing DRAM in to self-refresh (also referred to as | 
|  | // auto-refresh), place interconnects into lower-power states etc" | 
|  | int GetPackageIdleWakeupsPerSecond(); | 
|  | #endif | 
|  |  | 
|  | // Retrieves accounting information for all I/O operations performed by the | 
|  | // process. | 
|  | // If IO information is retrieved successfully, the function returns true | 
|  | // and fills in the IO_COUNTERS passed in. The function returns false | 
|  | // otherwise. | 
|  | bool GetIOCounters(IoCounters* io_counters) const; | 
|  |  | 
|  | #if defined(OS_LINUX) || defined(OS_AIX) || defined(OS_ANDROID) | 
|  | // Returns the number of file descriptors currently open by the process, or | 
|  | // -1 on error. | 
|  | int GetOpenFdCount() const; | 
|  |  | 
|  | // Returns the soft limit of file descriptors that can be opened by the | 
|  | // process, or -1 on error. | 
|  | int GetOpenFdSoftLimit() const; | 
|  | #endif  // defined(OS_LINUX) || defined(OS_AIX) || defined(OS_ANDROID) | 
|  |  | 
|  | #if defined(OS_LINUX) || defined(OS_ANDROID) | 
|  | // Bytes of swap as reported by /proc/[pid]/status. | 
|  | uint64_t GetVmSwapBytes() const; | 
|  |  | 
|  | // Minor and major page fault count as reported by /proc/[pid]/stat. | 
|  | // Returns true for success. | 
|  | bool GetPageFaultCounts(PageFaultCounts* counts) const; | 
|  | #endif  // defined(OS_LINUX) || defined(OS_ANDROID) | 
|  |  | 
|  | // Returns total memory usage of malloc. | 
|  | size_t GetMallocUsage(); | 
|  |  | 
|  | private: | 
|  | #if !defined(OS_MACOSX) || defined(OS_IOS) | 
|  | explicit ProcessMetrics(ProcessHandle process); | 
|  | #else | 
|  | ProcessMetrics(ProcessHandle process, PortProvider* port_provider); | 
|  | #endif  // !defined(OS_MACOSX) || defined(OS_IOS) | 
|  |  | 
|  | #if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX) | 
|  | int CalculateIdleWakeupsPerSecond(uint64_t absolute_idle_wakeups); | 
|  | #endif | 
|  | #if defined(OS_MACOSX) | 
|  | // The subset of wakeups that cause a "package exit" can be tracked on macOS. | 
|  | // See |GetPackageIdleWakeupsForSecond| comment for more info. | 
|  | int CalculatePackageIdleWakeupsPerSecond( | 
|  | uint64_t absolute_package_idle_wakeups); | 
|  | #endif | 
|  |  | 
|  | #if defined(OS_WIN) | 
|  | win::ScopedHandle process_; | 
|  | #else | 
|  | ProcessHandle process_; | 
|  | #endif | 
|  |  | 
|  | // Used to store the previous times and CPU usage counts so we can | 
|  | // compute the CPU usage between calls. | 
|  | TimeTicks last_cpu_time_; | 
|  | #if !defined(OS_FREEBSD) || !defined(OS_POSIX) | 
|  | TimeDelta last_cumulative_cpu_; | 
|  | #endif | 
|  |  | 
|  | #if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX) | 
|  | // Same thing for idle wakeups. | 
|  | TimeTicks last_idle_wakeups_time_; | 
|  | uint64_t last_absolute_idle_wakeups_; | 
|  | #endif | 
|  |  | 
|  | #if defined(OS_MACOSX) | 
|  | // And same thing for package idle exit wakeups. | 
|  | TimeTicks last_package_idle_wakeups_time_; | 
|  | uint64_t last_absolute_package_idle_wakeups_; | 
|  | #endif | 
|  |  | 
|  | #if !defined(OS_IOS) | 
|  | #if defined(OS_MACOSX) | 
|  | // Queries the port provider if it's set. | 
|  | mach_port_t TaskForPid(ProcessHandle process) const; | 
|  |  | 
|  | PortProvider* port_provider_; | 
|  | #endif  // defined(OS_MACOSX) | 
|  | #endif  // !defined(OS_IOS) | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(ProcessMetrics); | 
|  | }; | 
|  |  | 
|  | // Returns the memory committed by the system in KBytes. | 
|  | // Returns 0 if it can't compute the commit charge. | 
|  | BASE_EXPORT size_t GetSystemCommitCharge(); | 
|  |  | 
|  | // Returns the number of bytes in a memory page. Do not use this to compute | 
|  | // the number of pages in a block of memory for calling mincore(). On some | 
|  | // platforms, e.g. iOS, mincore() uses a different page size from what is | 
|  | // returned by GetPageSize(). | 
|  | BASE_EXPORT size_t GetPageSize(); | 
|  |  | 
|  | // Returns the maximum number of file descriptors that can be open by a process | 
|  | // at once. If the number is unavailable, a conservative best guess is returned. | 
|  | BASE_EXPORT size_t GetMaxFds(); | 
|  |  | 
|  | #if defined(OS_POSIX) && !defined(OS_FUCHSIA) | 
|  | // Increases the file descriptor soft limit to |max_descriptors| or the OS hard | 
|  | // limit, whichever is lower. If the limit is already higher than | 
|  | // |max_descriptors|, then nothing happens. | 
|  | BASE_EXPORT void IncreaseFdLimitTo(unsigned int max_descriptors); | 
|  | #endif  // defined(OS_POSIX) && !defined(OS_FUCHSIA) | 
|  |  | 
|  | #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \ | 
|  | defined(OS_ANDROID) || defined(OS_AIX) || defined(OS_FUCHSIA) | 
|  | // Data about system-wide memory consumption. Values are in KB. Available on | 
|  | // Windows, Mac, Linux, Android and Chrome OS. | 
|  | // | 
|  | // Total memory are available on all platforms that implement | 
|  | // GetSystemMemoryInfo(). Total/free swap memory are available on all platforms | 
|  | // except on Mac. Buffers/cached/active_anon/inactive_anon/active_file/ | 
|  | // inactive_file/dirty/reclaimable/pswpin/pswpout/pgmajfault are available on | 
|  | // Linux/Android/Chrome OS. Shmem/slab/gem_objects/gem_size are Chrome OS only. | 
|  | // Speculative/file_backed/purgeable are Mac and iOS only. | 
|  | // Free is absent on Windows (see "avail_phys" below). | 
|  | struct BASE_EXPORT SystemMemoryInfoKB { | 
|  | SystemMemoryInfoKB(); | 
|  | SystemMemoryInfoKB(const SystemMemoryInfoKB& other); | 
|  |  | 
|  | // Serializes the platform specific fields to value. | 
|  | std::unique_ptr<DictionaryValue> ToValue() const; | 
|  |  | 
|  | int total = 0; | 
|  |  | 
|  | #if !defined(OS_WIN) | 
|  | int free = 0; | 
|  | #endif | 
|  |  | 
|  | #if defined(OS_WIN) | 
|  | // "This is the amount of physical memory that can be immediately reused | 
|  | // without having to write its contents to disk first. It is the sum of the | 
|  | // size of the standby, free, and zero lists." (MSDN). | 
|  | // Standby: not modified pages of physical ram (file-backed memory) that are | 
|  | // not actively being used. | 
|  | int avail_phys = 0; | 
|  | #endif | 
|  |  | 
|  | #if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_AIX) | 
|  | // This provides an estimate of available memory as described here: | 
|  | // https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773 | 
|  | // NOTE: this is ONLY valid in kernels 3.14 and up.  Its value will always | 
|  | // be 0 in earlier kernel versions. | 
|  | // Note: it includes _all_ file-backed memory (active + inactive). | 
|  | int available = 0; | 
|  | #endif | 
|  |  | 
|  | #if !defined(OS_MACOSX) | 
|  | int swap_total = 0; | 
|  | int swap_free = 0; | 
|  | #endif | 
|  |  | 
|  | #if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_AIX) || \ | 
|  | defined(OS_FUCHSIA) | 
|  | int buffers = 0; | 
|  | int cached = 0; | 
|  | int active_anon = 0; | 
|  | int inactive_anon = 0; | 
|  | int active_file = 0; | 
|  | int inactive_file = 0; | 
|  | int dirty = 0; | 
|  | int reclaimable = 0; | 
|  | #endif  // defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_AIX) || | 
|  | // defined(OS_FUCHSIA) | 
|  |  | 
|  | #if defined(OS_CHROMEOS) | 
|  | int shmem = 0; | 
|  | int slab = 0; | 
|  | // Gem data will be -1 if not supported. | 
|  | int gem_objects = -1; | 
|  | long long gem_size = -1; | 
|  | #endif  // defined(OS_CHROMEOS) | 
|  |  | 
|  | #if defined(OS_MACOSX) | 
|  | int speculative = 0; | 
|  | int file_backed = 0; | 
|  | int purgeable = 0; | 
|  | #endif  // defined(OS_MACOSX) | 
|  | }; | 
|  |  | 
|  | // On Linux/Android/Chrome OS, system-wide memory consumption data is parsed | 
|  | // from /proc/meminfo and /proc/vmstat. On Windows/Mac, it is obtained using | 
|  | // system API calls. | 
|  | // | 
|  | // Fills in the provided |meminfo| structure. Returns true on success. | 
|  | // Exposed for memory debugging widget. | 
|  | BASE_EXPORT bool GetSystemMemoryInfo(SystemMemoryInfoKB* meminfo); | 
|  |  | 
|  | #endif  // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || | 
|  | // defined(OS_ANDROID) || defined(OS_AIX) || defined(OS_FUCHSIA) | 
|  |  | 
|  | #if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_AIX) | 
|  | // Parse the data found in /proc/<pid>/stat and return the sum of the | 
|  | // CPU-related ticks.  Returns -1 on parse error. | 
|  | // Exposed for testing. | 
|  | BASE_EXPORT int ParseProcStatCPU(StringPiece input); | 
|  |  | 
|  | // Get the number of threads of |process| as available in /proc/<pid>/stat. | 
|  | // This should be used with care as no synchronization with running threads is | 
|  | // done. This is mostly useful to guarantee being single-threaded. | 
|  | // Returns 0 on failure. | 
|  | BASE_EXPORT int GetNumberOfThreads(ProcessHandle process); | 
|  |  | 
|  | // /proc/self/exe refers to the current executable. | 
|  | BASE_EXPORT extern const char kProcSelfExe[]; | 
|  |  | 
|  | // Parses a string containing the contents of /proc/meminfo | 
|  | // returns true on success or false for a parsing error | 
|  | // Exposed for testing. | 
|  | BASE_EXPORT bool ParseProcMeminfo(StringPiece input, | 
|  | SystemMemoryInfoKB* meminfo); | 
|  |  | 
|  | // Data from /proc/vmstat. | 
|  | struct BASE_EXPORT VmStatInfo { | 
|  | // Serializes the platform specific fields to value. | 
|  | std::unique_ptr<DictionaryValue> ToValue() const; | 
|  |  | 
|  | unsigned long pswpin = 0; | 
|  | unsigned long pswpout = 0; | 
|  | unsigned long pgmajfault = 0; | 
|  | }; | 
|  |  | 
|  | // Retrieves data from /proc/vmstat about system-wide vm operations. | 
|  | // Fills in the provided |vmstat| structure. Returns true on success. | 
|  | BASE_EXPORT bool GetVmStatInfo(VmStatInfo* vmstat); | 
|  |  | 
|  | // Parses a string containing the contents of /proc/vmstat | 
|  | // returns true on success or false for a parsing error | 
|  | // Exposed for testing. | 
|  | BASE_EXPORT bool ParseProcVmstat(StringPiece input, VmStatInfo* vmstat); | 
|  |  | 
|  | // Data from /proc/diskstats about system-wide disk I/O. | 
|  | struct BASE_EXPORT SystemDiskInfo { | 
|  | SystemDiskInfo(); | 
|  | SystemDiskInfo(const SystemDiskInfo& other); | 
|  |  | 
|  | // Serializes the platform specific fields to value. | 
|  | std::unique_ptr<Value> ToValue() const; | 
|  |  | 
|  | uint64_t reads = 0; | 
|  | uint64_t reads_merged = 0; | 
|  | uint64_t sectors_read = 0; | 
|  | uint64_t read_time = 0; | 
|  | uint64_t writes = 0; | 
|  | uint64_t writes_merged = 0; | 
|  | uint64_t sectors_written = 0; | 
|  | uint64_t write_time = 0; | 
|  | uint64_t io = 0; | 
|  | uint64_t io_time = 0; | 
|  | uint64_t weighted_io_time = 0; | 
|  | }; | 
|  |  | 
|  | // Checks whether the candidate string is a valid disk name, [hsv]d[a-z]+ | 
|  | // for a generic disk or mmcblk[0-9]+ for the MMC case. | 
|  | // Names of disk partitions (e.g. sda1) are not valid. | 
|  | BASE_EXPORT bool IsValidDiskName(StringPiece candidate); | 
|  |  | 
|  | // Retrieves data from /proc/diskstats about system-wide disk I/O. | 
|  | // Fills in the provided |diskinfo| structure. Returns true on success. | 
|  | BASE_EXPORT bool GetSystemDiskInfo(SystemDiskInfo* diskinfo); | 
|  |  | 
|  | // Returns the amount of time spent in user space since boot across all CPUs. | 
|  | BASE_EXPORT TimeDelta GetUserCpuTimeSinceBoot(); | 
|  |  | 
|  | #endif  // defined(OS_LINUX) || defined(OS_ANDROID) | 
|  |  | 
|  | #if defined(OS_CHROMEOS) | 
|  | // Data from files in directory /sys/block/zram0 about ZRAM usage. | 
|  | struct BASE_EXPORT SwapInfo { | 
|  | SwapInfo() | 
|  | : num_reads(0), | 
|  | num_writes(0), | 
|  | compr_data_size(0), | 
|  | orig_data_size(0), | 
|  | mem_used_total(0) { | 
|  | } | 
|  |  | 
|  | // Serializes the platform specific fields to value. | 
|  | std::unique_ptr<Value> ToValue() const; | 
|  |  | 
|  | uint64_t num_reads = 0; | 
|  | uint64_t num_writes = 0; | 
|  | uint64_t compr_data_size = 0; | 
|  | uint64_t orig_data_size = 0; | 
|  | uint64_t mem_used_total = 0; | 
|  | }; | 
|  |  | 
|  | // Parses a string containing the contents of /sys/block/zram0/mm_stat. | 
|  | // This should be used for the new ZRAM sysfs interfaces. | 
|  | // Returns true on success or false for a parsing error. | 
|  | // Exposed for testing. | 
|  | BASE_EXPORT bool ParseZramMmStat(StringPiece mm_stat_data, SwapInfo* swap_info); | 
|  |  | 
|  | // Parses a string containing the contents of /sys/block/zram0/stat | 
|  | // This should be used for the new ZRAM sysfs interfaces. | 
|  | // Returns true on success or false for a parsing error. | 
|  | // Exposed for testing. | 
|  | BASE_EXPORT bool ParseZramStat(StringPiece stat_data, SwapInfo* swap_info); | 
|  |  | 
|  | // In ChromeOS, reads files from /sys/block/zram0 that contain ZRAM usage data. | 
|  | // Fills in the provided |swap_data| structure. | 
|  | // Returns true on success or false for a parsing error. | 
|  | BASE_EXPORT bool GetSwapInfo(SwapInfo* swap_info); | 
|  | #endif  // defined(OS_CHROMEOS) | 
|  |  | 
|  | // Collects and holds performance metrics for system memory and disk. | 
|  | // Provides functionality to retrieve the data on various platforms and | 
|  | // to serialize the stored data. | 
|  | class SystemMetrics { | 
|  | public: | 
|  | SystemMetrics(); | 
|  |  | 
|  | static SystemMetrics Sample(); | 
|  |  | 
|  | // Serializes the system metrics to value. | 
|  | std::unique_ptr<Value> ToValue() const; | 
|  |  | 
|  | private: | 
|  | FRIEND_TEST_ALL_PREFIXES(SystemMetricsTest, SystemMetrics); | 
|  |  | 
|  | size_t committed_memory_; | 
|  | #if defined(OS_LINUX) || defined(OS_ANDROID) | 
|  | SystemMemoryInfoKB memory_info_; | 
|  | VmStatInfo vmstat_info_; | 
|  | SystemDiskInfo disk_info_; | 
|  | #endif | 
|  | #if defined(OS_CHROMEOS) | 
|  | SwapInfo swap_info_; | 
|  | #endif | 
|  | }; | 
|  |  | 
|  | #if defined(OS_MACOSX) && !defined(OS_IOS) | 
|  | enum class MachVMRegionResult { | 
|  | // There were no more memory regions between |address| and the end of the | 
|  | // virtual address space. | 
|  | Finished, | 
|  |  | 
|  | // All output parameters are invalid. | 
|  | Error, | 
|  |  | 
|  | // All output parameters are filled in. | 
|  | Success | 
|  | }; | 
|  |  | 
|  | // Returns info on the first memory region at or after |address|, including | 
|  | // resident memory and share mode. On Success, |size| reflects the size of the | 
|  | // memory region. | 
|  | // |size| and |info| are output parameters, only valid on Success. | 
|  | // |address| is an in-out parameter, than represents both the address to start | 
|  | // looking, and the start address of the memory region. | 
|  | BASE_EXPORT MachVMRegionResult GetTopInfo(mach_port_t task, | 
|  | mach_vm_size_t* size, | 
|  | mach_vm_address_t* address, | 
|  | vm_region_top_info_data_t* info); | 
|  |  | 
|  | // Returns info on the first memory region at or after |address|, including | 
|  | // protection values. On Success, |size| reflects the size of the | 
|  | // memory region. | 
|  | // Returns info on the first memory region at or after |address|, including | 
|  | // resident memory and share mode. | 
|  | // |size| and |info| are output parameters, only valid on Success. | 
|  | BASE_EXPORT MachVMRegionResult GetBasicInfo(mach_port_t task, | 
|  | mach_vm_size_t* size, | 
|  | mach_vm_address_t* address, | 
|  | vm_region_basic_info_64* info); | 
|  | #endif  // defined(OS_MACOSX) && !defined(OS_IOS) | 
|  |  | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_PROCESS_PROCESS_METRICS_H_ |