1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #include "base/sys_info.h" 6*635a8641SAndroid Build Coastguard Worker 7*635a8641SAndroid Build Coastguard Worker #include <stddef.h> 8*635a8641SAndroid Build Coastguard Worker #include <stdint.h> 9*635a8641SAndroid Build Coastguard Worker 10*635a8641SAndroid Build Coastguard Worker #include <limits> 11*635a8641SAndroid Build Coastguard Worker 12*635a8641SAndroid Build Coastguard Worker #include "base/files/file_util.h" 13*635a8641SAndroid Build Coastguard Worker #include "base/lazy_instance.h" 14*635a8641SAndroid Build Coastguard Worker #include "base/logging.h" 15*635a8641SAndroid Build Coastguard Worker #include "base/numerics/safe_conversions.h" 16*635a8641SAndroid Build Coastguard Worker #include "base/process/process_metrics.h" 17*635a8641SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h" 18*635a8641SAndroid Build Coastguard Worker #include "base/sys_info_internal.h" 19*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h" 20*635a8641SAndroid Build Coastguard Worker 21*635a8641SAndroid Build Coastguard Worker namespace { 22*635a8641SAndroid Build Coastguard Worker AmountOfMemory(int pages_name)23*635a8641SAndroid Build Coastguard Workerint64_t AmountOfMemory(int pages_name) { 24*635a8641SAndroid Build Coastguard Worker long pages = sysconf(pages_name); 25*635a8641SAndroid Build Coastguard Worker long page_size = sysconf(_SC_PAGESIZE); 26*635a8641SAndroid Build Coastguard Worker if (pages == -1 || page_size == -1) { 27*635a8641SAndroid Build Coastguard Worker NOTREACHED(); 28*635a8641SAndroid Build Coastguard Worker return 0; 29*635a8641SAndroid Build Coastguard Worker } 30*635a8641SAndroid Build Coastguard Worker return static_cast<int64_t>(pages) * page_size; 31*635a8641SAndroid Build Coastguard Worker } 32*635a8641SAndroid Build Coastguard Worker AmountOfPhysicalMemory()33*635a8641SAndroid Build Coastguard Workerint64_t AmountOfPhysicalMemory() { 34*635a8641SAndroid Build Coastguard Worker return AmountOfMemory(_SC_PHYS_PAGES); 35*635a8641SAndroid Build Coastguard Worker } 36*635a8641SAndroid Build Coastguard Worker 37*635a8641SAndroid Build Coastguard Worker base::LazyInstance< 38*635a8641SAndroid Build Coastguard Worker base::internal::LazySysInfoValue<int64_t, AmountOfPhysicalMemory>>::Leaky 39*635a8641SAndroid Build Coastguard Worker g_lazy_physical_memory = LAZY_INSTANCE_INITIALIZER; 40*635a8641SAndroid Build Coastguard Worker 41*635a8641SAndroid Build Coastguard Worker } // namespace 42*635a8641SAndroid Build Coastguard Worker 43*635a8641SAndroid Build Coastguard Worker namespace base { 44*635a8641SAndroid Build Coastguard Worker 45*635a8641SAndroid Build Coastguard Worker // static AmountOfPhysicalMemoryImpl()46*635a8641SAndroid Build Coastguard Workerint64_t SysInfo::AmountOfPhysicalMemoryImpl() { 47*635a8641SAndroid Build Coastguard Worker return g_lazy_physical_memory.Get().value(); 48*635a8641SAndroid Build Coastguard Worker } 49*635a8641SAndroid Build Coastguard Worker 50*635a8641SAndroid Build Coastguard Worker // static AmountOfAvailablePhysicalMemoryImpl()51*635a8641SAndroid Build Coastguard Workerint64_t SysInfo::AmountOfAvailablePhysicalMemoryImpl() { 52*635a8641SAndroid Build Coastguard Worker SystemMemoryInfoKB info; 53*635a8641SAndroid Build Coastguard Worker if (!GetSystemMemoryInfo(&info)) 54*635a8641SAndroid Build Coastguard Worker return 0; 55*635a8641SAndroid Build Coastguard Worker return AmountOfAvailablePhysicalMemory(info); 56*635a8641SAndroid Build Coastguard Worker } 57*635a8641SAndroid Build Coastguard Worker 58*635a8641SAndroid Build Coastguard Worker // static AmountOfAvailablePhysicalMemory(const SystemMemoryInfoKB & info)59*635a8641SAndroid Build Coastguard Workerint64_t SysInfo::AmountOfAvailablePhysicalMemory( 60*635a8641SAndroid Build Coastguard Worker const SystemMemoryInfoKB& info) { 61*635a8641SAndroid Build Coastguard Worker // See details here: 62*635a8641SAndroid Build Coastguard Worker // https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773 63*635a8641SAndroid Build Coastguard Worker // The fallback logic (when there is no MemAvailable) would be more precise 64*635a8641SAndroid Build Coastguard Worker // if we had info about zones watermarks (/proc/zoneinfo). 65*635a8641SAndroid Build Coastguard Worker int64_t res_kb = info.available != 0 66*635a8641SAndroid Build Coastguard Worker ? info.available - info.active_file 67*635a8641SAndroid Build Coastguard Worker : info.free + info.reclaimable + info.inactive_file; 68*635a8641SAndroid Build Coastguard Worker return res_kb * 1024; 69*635a8641SAndroid Build Coastguard Worker } 70*635a8641SAndroid Build Coastguard Worker 71*635a8641SAndroid Build Coastguard Worker // static CPUModelName()72*635a8641SAndroid Build Coastguard Workerstd::string SysInfo::CPUModelName() { 73*635a8641SAndroid Build Coastguard Worker #if defined(OS_CHROMEOS) && defined(ARCH_CPU_ARMEL) 74*635a8641SAndroid Build Coastguard Worker const char kCpuModelPrefix[] = "Hardware"; 75*635a8641SAndroid Build Coastguard Worker #else 76*635a8641SAndroid Build Coastguard Worker const char kCpuModelPrefix[] = "model name"; 77*635a8641SAndroid Build Coastguard Worker #endif 78*635a8641SAndroid Build Coastguard Worker std::string contents; 79*635a8641SAndroid Build Coastguard Worker ReadFileToString(FilePath("/proc/cpuinfo"), &contents); 80*635a8641SAndroid Build Coastguard Worker DCHECK(!contents.empty()); 81*635a8641SAndroid Build Coastguard Worker if (!contents.empty()) { 82*635a8641SAndroid Build Coastguard Worker std::istringstream iss(contents); 83*635a8641SAndroid Build Coastguard Worker std::string line; 84*635a8641SAndroid Build Coastguard Worker while (std::getline(iss, line)) { 85*635a8641SAndroid Build Coastguard Worker if (line.compare(0, strlen(kCpuModelPrefix), kCpuModelPrefix) == 0) { 86*635a8641SAndroid Build Coastguard Worker size_t pos = line.find(": "); 87*635a8641SAndroid Build Coastguard Worker return line.substr(pos + 2); 88*635a8641SAndroid Build Coastguard Worker } 89*635a8641SAndroid Build Coastguard Worker } 90*635a8641SAndroid Build Coastguard Worker } 91*635a8641SAndroid Build Coastguard Worker return std::string(); 92*635a8641SAndroid Build Coastguard Worker } 93*635a8641SAndroid Build Coastguard Worker 94*635a8641SAndroid Build Coastguard Worker } // namespace base 95