xref: /aosp_15_r20/external/libchrome/base/sys_info_linux.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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 Worker int64_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 Worker int64_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 Worker int64_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 Worker int64_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 Worker int64_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 Worker std::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