xref: /aosp_15_r20/external/libchrome/base/sys_info.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 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 <algorithm>
8*635a8641SAndroid Build Coastguard Worker 
9*635a8641SAndroid Build Coastguard Worker #include "base/base_switches.h"
10*635a8641SAndroid Build Coastguard Worker #include "base/command_line.h"
11*635a8641SAndroid Build Coastguard Worker #include "base/lazy_instance.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/sys_info_internal.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/time/time.h"
14*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h"
15*635a8641SAndroid Build Coastguard Worker 
16*635a8641SAndroid Build Coastguard Worker namespace base {
17*635a8641SAndroid Build Coastguard Worker namespace {
18*635a8641SAndroid Build Coastguard Worker static const int kLowMemoryDeviceThresholdMB = 512;
19*635a8641SAndroid Build Coastguard Worker }
20*635a8641SAndroid Build Coastguard Worker 
21*635a8641SAndroid Build Coastguard Worker // static
AmountOfPhysicalMemory()22*635a8641SAndroid Build Coastguard Worker int64_t SysInfo::AmountOfPhysicalMemory() {
23*635a8641SAndroid Build Coastguard Worker   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
24*635a8641SAndroid Build Coastguard Worker           switches::kEnableLowEndDeviceMode)) {
25*635a8641SAndroid Build Coastguard Worker     return kLowMemoryDeviceThresholdMB * 1024 * 1024;
26*635a8641SAndroid Build Coastguard Worker   }
27*635a8641SAndroid Build Coastguard Worker 
28*635a8641SAndroid Build Coastguard Worker   return AmountOfPhysicalMemoryImpl();
29*635a8641SAndroid Build Coastguard Worker }
30*635a8641SAndroid Build Coastguard Worker 
31*635a8641SAndroid Build Coastguard Worker // static
AmountOfAvailablePhysicalMemory()32*635a8641SAndroid Build Coastguard Worker int64_t SysInfo::AmountOfAvailablePhysicalMemory() {
33*635a8641SAndroid Build Coastguard Worker   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
34*635a8641SAndroid Build Coastguard Worker           switches::kEnableLowEndDeviceMode)) {
35*635a8641SAndroid Build Coastguard Worker     // Estimate the available memory by subtracting our memory used estimate
36*635a8641SAndroid Build Coastguard Worker     // from the fake |kLowMemoryDeviceThresholdMB| limit.
37*635a8641SAndroid Build Coastguard Worker     size_t memory_used =
38*635a8641SAndroid Build Coastguard Worker         AmountOfPhysicalMemoryImpl() - AmountOfAvailablePhysicalMemoryImpl();
39*635a8641SAndroid Build Coastguard Worker     size_t memory_limit = kLowMemoryDeviceThresholdMB * 1024 * 1024;
40*635a8641SAndroid Build Coastguard Worker     // std::min ensures no underflow, as |memory_used| can be > |memory_limit|.
41*635a8641SAndroid Build Coastguard Worker     return memory_limit - std::min(memory_used, memory_limit);
42*635a8641SAndroid Build Coastguard Worker   }
43*635a8641SAndroid Build Coastguard Worker 
44*635a8641SAndroid Build Coastguard Worker   return AmountOfAvailablePhysicalMemoryImpl();
45*635a8641SAndroid Build Coastguard Worker }
46*635a8641SAndroid Build Coastguard Worker 
IsLowEndDevice()47*635a8641SAndroid Build Coastguard Worker bool SysInfo::IsLowEndDevice() {
48*635a8641SAndroid Build Coastguard Worker   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
49*635a8641SAndroid Build Coastguard Worker           switches::kEnableLowEndDeviceMode)) {
50*635a8641SAndroid Build Coastguard Worker     return true;
51*635a8641SAndroid Build Coastguard Worker   }
52*635a8641SAndroid Build Coastguard Worker 
53*635a8641SAndroid Build Coastguard Worker   return IsLowEndDeviceImpl();
54*635a8641SAndroid Build Coastguard Worker }
55*635a8641SAndroid Build Coastguard Worker 
56*635a8641SAndroid Build Coastguard Worker #if !defined(OS_ANDROID)
57*635a8641SAndroid Build Coastguard Worker 
DetectLowEndDevice()58*635a8641SAndroid Build Coastguard Worker bool DetectLowEndDevice() {
59*635a8641SAndroid Build Coastguard Worker   CommandLine* command_line = CommandLine::ForCurrentProcess();
60*635a8641SAndroid Build Coastguard Worker   if (command_line->HasSwitch(switches::kEnableLowEndDeviceMode))
61*635a8641SAndroid Build Coastguard Worker     return true;
62*635a8641SAndroid Build Coastguard Worker   if (command_line->HasSwitch(switches::kDisableLowEndDeviceMode))
63*635a8641SAndroid Build Coastguard Worker     return false;
64*635a8641SAndroid Build Coastguard Worker 
65*635a8641SAndroid Build Coastguard Worker   int ram_size_mb = SysInfo::AmountOfPhysicalMemoryMB();
66*635a8641SAndroid Build Coastguard Worker   return (ram_size_mb > 0 && ram_size_mb <= kLowMemoryDeviceThresholdMB);
67*635a8641SAndroid Build Coastguard Worker }
68*635a8641SAndroid Build Coastguard Worker 
69*635a8641SAndroid Build Coastguard Worker static LazyInstance<
70*635a8641SAndroid Build Coastguard Worker   internal::LazySysInfoValue<bool, DetectLowEndDevice> >::Leaky
71*635a8641SAndroid Build Coastguard Worker   g_lazy_low_end_device = LAZY_INSTANCE_INITIALIZER;
72*635a8641SAndroid Build Coastguard Worker 
73*635a8641SAndroid Build Coastguard Worker // static
IsLowEndDeviceImpl()74*635a8641SAndroid Build Coastguard Worker bool SysInfo::IsLowEndDeviceImpl() {
75*635a8641SAndroid Build Coastguard Worker   return g_lazy_low_end_device.Get().value();
76*635a8641SAndroid Build Coastguard Worker }
77*635a8641SAndroid Build Coastguard Worker #endif
78*635a8641SAndroid Build Coastguard Worker 
79*635a8641SAndroid Build Coastguard Worker #if !defined(OS_MACOSX) && !defined(OS_ANDROID)
HardwareModelName()80*635a8641SAndroid Build Coastguard Worker std::string SysInfo::HardwareModelName() {
81*635a8641SAndroid Build Coastguard Worker   return std::string();
82*635a8641SAndroid Build Coastguard Worker }
83*635a8641SAndroid Build Coastguard Worker #endif
84*635a8641SAndroid Build Coastguard Worker 
85*635a8641SAndroid Build Coastguard Worker // static
Uptime()86*635a8641SAndroid Build Coastguard Worker base::TimeDelta SysInfo::Uptime() {
87*635a8641SAndroid Build Coastguard Worker   // This code relies on an implementation detail of TimeTicks::Now() - that
88*635a8641SAndroid Build Coastguard Worker   // its return value happens to coincide with the system uptime value in
89*635a8641SAndroid Build Coastguard Worker   // microseconds, on Win/Mac/iOS/Linux/ChromeOS and Android.
90*635a8641SAndroid Build Coastguard Worker   int64_t uptime_in_microseconds = TimeTicks::Now().ToInternalValue();
91*635a8641SAndroid Build Coastguard Worker   return base::TimeDelta::FromMicroseconds(uptime_in_microseconds);
92*635a8641SAndroid Build Coastguard Worker }
93*635a8641SAndroid Build Coastguard Worker 
94*635a8641SAndroid Build Coastguard Worker }  // namespace base
95