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