1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2012 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#ifndef BASE_SYS_INFO_H_
6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define BASE_SYS_INFO_H_
7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
80d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include <stddef.h>
90d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include <stdint.h>
100d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko
11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <map>
12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <string>
13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/base_export.h"
15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/files/file_path.h"
16319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski#include "base/gtest_prod_util.h"
17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/time/time.h"
18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "build/build_config.h"
19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base {
21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
22319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowskinamespace debug {
23319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub PawlowskiFORWARD_DECLARE_TEST(SystemMetricsTest, ParseMeminfo);
24319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski}
25319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski
26319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowskistruct SystemMemoryInfoKB;
27319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski
28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass BASE_EXPORT SysInfo {
29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public:
30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Return the number of logical processors/cores on the current machine.
31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static int NumberOfProcessors();
32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Return the number of bytes of physical memory on the current machine.
340d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  static int64_t AmountOfPhysicalMemory();
35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Return the number of bytes of current available physical memory on the
37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // machine.
38319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  // (The amount of memory that can be allocated without any significant
39319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  // impact on the system. It can lead to freeing inactive file-backed
40319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  // and/or speculative file-backed memory).
410d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  static int64_t AmountOfAvailablePhysicalMemory();
42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Return the number of bytes of virtual memory of this process. A return
44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // value of zero means that there is no limit on the available virtual
45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // memory.
460d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  static int64_t AmountOfVirtualMemory();
47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Return the number of megabytes of physical memory on the current machine.
49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static int AmountOfPhysicalMemoryMB() {
50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    return static_cast<int>(AmountOfPhysicalMemory() / 1024 / 1024);
51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
52b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
53b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Return the number of megabytes of available virtual memory, or zero if it
54b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // is unlimited.
55b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static int AmountOfVirtualMemoryMB() {
56b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    return static_cast<int>(AmountOfVirtualMemory() / 1024 / 1024);
57b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
58b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
59b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Return the available disk space in bytes on the volume containing |path|,
60b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // or -1 on failure.
610d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  static int64_t AmountOfFreeDiskSpace(const FilePath& path);
62b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  // Return the total disk space in bytes on the volume containing |path|, or -1
640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  // on failure.
650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  static int64_t AmountOfTotalDiskSpace(const FilePath& path);
660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
670d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  // Returns system uptime.
680d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  static TimeDelta Uptime();
69b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
70b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Returns a descriptive string for the current machine model or an empty
710d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  // string if the machine model is unknown or an error occured.
720d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  // e.g. "MacPro1,1" on Mac, or "Nexus 5" on Android. Only implemented on OS X,
730d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  // Android, and Chrome OS. This returns an empty string on other platforms.
74b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static std::string HardwareModelName();
75b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
76b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Returns the name of the host operating system.
77b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static std::string OperatingSystemName();
78b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
79b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Returns the version of the host operating system.
80b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static std::string OperatingSystemVersion();
81b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
82b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Retrieves detailed numeric values for the OS version.
83b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // DON'T USE THIS ON THE MAC OR WINDOWS to determine the current OS release
84b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // for OS version-specific feature checks and workarounds. If you must use
85b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // an OS version check instead of a feature check, use the base::mac::IsOS*
86b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // family from base/mac/mac_util.h, or base::win::GetVersion from
87b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // base/win/windows_version.h.
880d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko  static void OperatingSystemVersionNumbers(int32_t* major_version,
890d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko                                            int32_t* minor_version,
900d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko                                            int32_t* bugfix_version);
91b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
92b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Returns the architecture of the running operating system.
93b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Exact return value may differ across platforms.
94b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // e.g. a 32-bit x86 kernel on a 64-bit capable CPU will return "x86",
95b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  //      whereas a x86-64 kernel on the same CPU will return "x86_64"
96b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static std::string OperatingSystemArchitecture();
97b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
98b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Avoid using this. Use base/cpu.h to get information about the CPU instead.
99b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // http://crbug.com/148884
100b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Returns the CPU model name of the system. If it can not be figured out,
101b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // an empty string is returned.
102b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static std::string CPUModelName();
103b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
104b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Return the smallest amount of memory (in bytes) which the VM system will
105b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // allocate.
106b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static size_t VMAllocationGranularity();
107b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
108b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_CHROMEOS)
109b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  typedef std::map<std::string, std::string> LsbReleaseMap;
110b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
111b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Returns the contents of /etc/lsb-release as a map.
112b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static const LsbReleaseMap& GetLsbReleaseMap();
113b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
114b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // If |key| is present in the LsbReleaseMap, sets |value| and returns true.
115b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static bool GetLsbReleaseValue(const std::string& key, std::string* value);
116b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
117b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Convenience function for GetLsbReleaseValue("CHROMEOS_RELEASE_BOARD",...).
11836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  // Returns "unknown" if CHROMEOS_RELEASE_BOARD is not set. Otherwise returns
11936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  // the full name of the board. WARNING: the returned value often differs in
12036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  // developer built system compared to devices that use the official version.
12136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  // E.g. for developer built version, the function could return 'glimmer' while
12236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  // for officially used versions it would be like 'glimmer-signed-mp-v4keys'.
12336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  // Use GetStrippedReleaseBoard() function if you need only the short name of
12436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  // the board (would be 'glimmer' in the case described above).
125b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static std::string GetLsbReleaseBoard();
126b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
12736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  // Convenience function for GetLsbReleaseBoard() removing trailing "-signed-*"
12836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  // if present. Returns "unknown" if CHROMEOS_RELEASE_BOARD is not set.
12936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe  static std::string GetStrippedReleaseBoard();
13036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe
131b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Returns the creation time of /etc/lsb-release. (Used to get the date and
132b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // time of the Chrome OS build).
133b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static Time GetLsbReleaseTime();
134b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
135b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Returns true when actually running in a Chrome OS environment.
136b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static bool IsRunningOnChromeOS();
137b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
138b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Test method to force re-parsing of lsb-release.
139b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static void SetChromeOSVersionInfoForTest(const std::string& lsb_release,
140b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                            const Time& lsb_release_time);
141b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif  // defined(OS_CHROMEOS)
142b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
143b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_ANDROID)
144b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Returns the Android build's codename.
145b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static std::string GetAndroidBuildCodename();
146b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
147b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Returns the Android build ID.
148b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static std::string GetAndroidBuildID();
149b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
150b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static int DalvikHeapSizeMB();
151b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static int DalvikHeapGrowthLimitMB();
152b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif  // defined(OS_ANDROID)
153b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
154b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Returns true if this is a low-end device.
155b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Low-end device refers to devices having less than 512M memory in the
156b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // current implementation.
157b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static bool IsLowEndDevice();
158319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski
159319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski private:
160319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  FRIEND_TEST_ALL_PREFIXES(SysInfoTest, AmountOfAvailablePhysicalMemory);
161319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  FRIEND_TEST_ALL_PREFIXES(debug::SystemMetricsTest, ParseMeminfo);
162319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski
163319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski#if defined(OS_LINUX) || defined(OS_ANDROID)
164319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski  static int64_t AmountOfAvailablePhysicalMemory(
165319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski      const SystemMemoryInfoKB& meminfo);
166319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski#endif
167b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
168b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
169b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace base
170b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
171b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif  // BASE_SYS_INFO_H_
172