1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/system/sys_info.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <algorithm>
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #include "base/base_switches.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/command_line.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/features.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/location.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/notreached.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/system/sys_info_internal.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/task/task_traits.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/task/thread_pool.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
20*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
21*6777b538SAndroid Build Coastguard Worker
22*6777b538SAndroid Build Coastguard Worker namespace base {
23*6777b538SAndroid Build Coastguard Worker namespace {
24*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_IOS)
25*6777b538SAndroid Build Coastguard Worker // For M99, 45% of devices have 2GB of RAM, and 55% have more.
26*6777b538SAndroid Build Coastguard Worker constexpr uint64_t kLowMemoryDeviceThresholdMB = 1024;
27*6777b538SAndroid Build Coastguard Worker #else
28*6777b538SAndroid Build Coastguard Worker // Updated Desktop default threshold to match the Android 2021 definition.
29*6777b538SAndroid Build Coastguard Worker constexpr uint64_t kLowMemoryDeviceThresholdMB = 2048;
30*6777b538SAndroid Build Coastguard Worker #endif
31*6777b538SAndroid Build Coastguard Worker
32*6777b538SAndroid Build Coastguard Worker std::optional<uint64_t> g_amount_of_physical_memory_mb_for_testing;
33*6777b538SAndroid Build Coastguard Worker } // namespace
34*6777b538SAndroid Build Coastguard Worker
35*6777b538SAndroid Build Coastguard Worker // static
NumberOfEfficientProcessors()36*6777b538SAndroid Build Coastguard Worker int SysInfo::NumberOfEfficientProcessors() {
37*6777b538SAndroid Build Coastguard Worker static int number_of_efficient_processors = NumberOfEfficientProcessorsImpl();
38*6777b538SAndroid Build Coastguard Worker return number_of_efficient_processors;
39*6777b538SAndroid Build Coastguard Worker }
40*6777b538SAndroid Build Coastguard Worker
41*6777b538SAndroid Build Coastguard Worker // static
AmountOfPhysicalMemory()42*6777b538SAndroid Build Coastguard Worker uint64_t SysInfo::AmountOfPhysicalMemory() {
43*6777b538SAndroid Build Coastguard Worker constexpr uint64_t kMB = 1024 * 1024;
44*6777b538SAndroid Build Coastguard Worker
45*6777b538SAndroid Build Coastguard Worker if (base::CommandLine::ForCurrentProcess()->HasSwitch(
46*6777b538SAndroid Build Coastguard Worker switches::kEnableLowEndDeviceMode)) {
47*6777b538SAndroid Build Coastguard Worker // Keep using 512MB as the simulated RAM amount for when users or tests have
48*6777b538SAndroid Build Coastguard Worker // manually enabled low-end device mode. Note this value is different from
49*6777b538SAndroid Build Coastguard Worker // the threshold used for low end devices.
50*6777b538SAndroid Build Coastguard Worker constexpr uint64_t kSimulatedMemoryForEnableLowEndDeviceMode = 512 * kMB;
51*6777b538SAndroid Build Coastguard Worker return std::min(kSimulatedMemoryForEnableLowEndDeviceMode,
52*6777b538SAndroid Build Coastguard Worker AmountOfPhysicalMemoryImpl());
53*6777b538SAndroid Build Coastguard Worker }
54*6777b538SAndroid Build Coastguard Worker
55*6777b538SAndroid Build Coastguard Worker if (g_amount_of_physical_memory_mb_for_testing) {
56*6777b538SAndroid Build Coastguard Worker return g_amount_of_physical_memory_mb_for_testing.value() * kMB;
57*6777b538SAndroid Build Coastguard Worker }
58*6777b538SAndroid Build Coastguard Worker
59*6777b538SAndroid Build Coastguard Worker return AmountOfPhysicalMemoryImpl();
60*6777b538SAndroid Build Coastguard Worker }
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard Worker // static
AmountOfAvailablePhysicalMemory()63*6777b538SAndroid Build Coastguard Worker uint64_t SysInfo::AmountOfAvailablePhysicalMemory() {
64*6777b538SAndroid Build Coastguard Worker if (base::CommandLine::ForCurrentProcess()->HasSwitch(
65*6777b538SAndroid Build Coastguard Worker switches::kEnableLowEndDeviceMode)) {
66*6777b538SAndroid Build Coastguard Worker // Estimate the available memory by subtracting our memory used estimate
67*6777b538SAndroid Build Coastguard Worker // from the fake |kLowMemoryDeviceThresholdMB| limit.
68*6777b538SAndroid Build Coastguard Worker uint64_t memory_used =
69*6777b538SAndroid Build Coastguard Worker AmountOfPhysicalMemoryImpl() - AmountOfAvailablePhysicalMemoryImpl();
70*6777b538SAndroid Build Coastguard Worker uint64_t memory_limit = kLowMemoryDeviceThresholdMB * 1024 * 1024;
71*6777b538SAndroid Build Coastguard Worker // std::min ensures no underflow, as |memory_used| can be > |memory_limit|.
72*6777b538SAndroid Build Coastguard Worker return memory_limit - std::min(memory_used, memory_limit);
73*6777b538SAndroid Build Coastguard Worker }
74*6777b538SAndroid Build Coastguard Worker
75*6777b538SAndroid Build Coastguard Worker return AmountOfAvailablePhysicalMemoryImpl();
76*6777b538SAndroid Build Coastguard Worker }
77*6777b538SAndroid Build Coastguard Worker
IsLowEndDevice()78*6777b538SAndroid Build Coastguard Worker bool SysInfo::IsLowEndDevice() {
79*6777b538SAndroid Build Coastguard Worker if (base::CommandLine::ForCurrentProcess()->HasSwitch(
80*6777b538SAndroid Build Coastguard Worker switches::kEnableLowEndDeviceMode)) {
81*6777b538SAndroid Build Coastguard Worker return true;
82*6777b538SAndroid Build Coastguard Worker }
83*6777b538SAndroid Build Coastguard Worker
84*6777b538SAndroid Build Coastguard Worker return IsLowEndDeviceImpl();
85*6777b538SAndroid Build Coastguard Worker }
86*6777b538SAndroid Build Coastguard Worker
87*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS)
88*6777b538SAndroid Build Coastguard Worker
89*6777b538SAndroid Build Coastguard Worker namespace {
90*6777b538SAndroid Build Coastguard Worker
91*6777b538SAndroid Build Coastguard Worker enum class BucketizedSize {
92*6777b538SAndroid Build Coastguard Worker k2GbOrLess,
93*6777b538SAndroid Build Coastguard Worker k3Gb,
94*6777b538SAndroid Build Coastguard Worker k4Gb,
95*6777b538SAndroid Build Coastguard Worker k6Gb,
96*6777b538SAndroid Build Coastguard Worker k8GbOrHigher,
97*6777b538SAndroid Build Coastguard Worker };
98*6777b538SAndroid Build Coastguard Worker
GetSystemRamBucketizedSize()99*6777b538SAndroid Build Coastguard Worker BucketizedSize GetSystemRamBucketizedSize() {
100*6777b538SAndroid Build Coastguard Worker int physical_memory = base::SysInfo::AmountOfPhysicalMemoryMB();
101*6777b538SAndroid Build Coastguard Worker
102*6777b538SAndroid Build Coastguard Worker // Because of Android carveouts, AmountOfPhysicalMemory() returns smaller
103*6777b538SAndroid Build Coastguard Worker // than the actual memory size, So we will use a small lowerbound than "X"GB
104*6777b538SAndroid Build Coastguard Worker // to discriminate real "X"GB devices from lower memory ones.
105*6777b538SAndroid Build Coastguard Worker // Addendum: This logic should also work for ChromeOS.
106*6777b538SAndroid Build Coastguard Worker
107*6777b538SAndroid Build Coastguard Worker constexpr int kUpperBound2GB = 2 * 1024; // inclusive
108*6777b538SAndroid Build Coastguard Worker if (physical_memory <= kUpperBound2GB) {
109*6777b538SAndroid Build Coastguard Worker return BucketizedSize::k2GbOrLess;
110*6777b538SAndroid Build Coastguard Worker }
111*6777b538SAndroid Build Coastguard Worker
112*6777b538SAndroid Build Coastguard Worker constexpr int kLowerBound3GB = kUpperBound2GB; // exclusive
113*6777b538SAndroid Build Coastguard Worker constexpr int kUpperBound3GB = 3.2 * 1024; // inclusive
114*6777b538SAndroid Build Coastguard Worker if (kLowerBound3GB < physical_memory && physical_memory <= kUpperBound3GB) {
115*6777b538SAndroid Build Coastguard Worker return BucketizedSize::k3Gb;
116*6777b538SAndroid Build Coastguard Worker }
117*6777b538SAndroid Build Coastguard Worker
118*6777b538SAndroid Build Coastguard Worker constexpr int kLowerBound4GB = kUpperBound3GB; // exclusive
119*6777b538SAndroid Build Coastguard Worker constexpr int kUpperBound4GB = 4 * 1024; // inclusive
120*6777b538SAndroid Build Coastguard Worker if (kLowerBound4GB < physical_memory && physical_memory <= kUpperBound4GB) {
121*6777b538SAndroid Build Coastguard Worker return BucketizedSize::k4Gb;
122*6777b538SAndroid Build Coastguard Worker }
123*6777b538SAndroid Build Coastguard Worker
124*6777b538SAndroid Build Coastguard Worker constexpr int kLowerBound6GB = kUpperBound4GB; // exclusive
125*6777b538SAndroid Build Coastguard Worker constexpr int kUpperBound6GB = 6.5 * 1024 - 1; // inclusive
126*6777b538SAndroid Build Coastguard Worker if (kLowerBound6GB < physical_memory && physical_memory <= kUpperBound6GB) {
127*6777b538SAndroid Build Coastguard Worker return BucketizedSize::k6Gb;
128*6777b538SAndroid Build Coastguard Worker }
129*6777b538SAndroid Build Coastguard Worker
130*6777b538SAndroid Build Coastguard Worker return BucketizedSize::k8GbOrHigher;
131*6777b538SAndroid Build Coastguard Worker }
132*6777b538SAndroid Build Coastguard Worker
GetCachedSystemRamBucketizedSize()133*6777b538SAndroid Build Coastguard Worker BucketizedSize GetCachedSystemRamBucketizedSize() {
134*6777b538SAndroid Build Coastguard Worker static BucketizedSize s_size = GetSystemRamBucketizedSize();
135*6777b538SAndroid Build Coastguard Worker return s_size;
136*6777b538SAndroid Build Coastguard Worker }
137*6777b538SAndroid Build Coastguard Worker
IsPartialLowEndModeOnMidRangeDevicesEnabled()138*6777b538SAndroid Build Coastguard Worker bool IsPartialLowEndModeOnMidRangeDevicesEnabled() {
139*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/1434873): make the feature not enable on 32-bit devices
140*6777b538SAndroid Build Coastguard Worker // before launching or going to high Stable %.
141*6777b538SAndroid Build Coastguard Worker return SysInfo::Is4GbOr6GbDevice() &&
142*6777b538SAndroid Build Coastguard Worker base::FeatureList::IsEnabled(
143*6777b538SAndroid Build Coastguard Worker features::kPartialLowEndModeOnMidRangeDevices);
144*6777b538SAndroid Build Coastguard Worker }
145*6777b538SAndroid Build Coastguard Worker
IsPartialLowEndModeOn3GbDevicesEnabled()146*6777b538SAndroid Build Coastguard Worker bool IsPartialLowEndModeOn3GbDevicesEnabled() {
147*6777b538SAndroid Build Coastguard Worker return SysInfo::Is3GbDevice() &&
148*6777b538SAndroid Build Coastguard Worker base::FeatureList::IsEnabled(features::kPartialLowEndModeOn3GbDevices);
149*6777b538SAndroid Build Coastguard Worker }
150*6777b538SAndroid Build Coastguard Worker
151*6777b538SAndroid Build Coastguard Worker } // namespace
152*6777b538SAndroid Build Coastguard Worker
Is3GbDevice()153*6777b538SAndroid Build Coastguard Worker bool SysInfo::Is3GbDevice() {
154*6777b538SAndroid Build Coastguard Worker return GetCachedSystemRamBucketizedSize() == BucketizedSize::k3Gb;
155*6777b538SAndroid Build Coastguard Worker }
156*6777b538SAndroid Build Coastguard Worker
Is4GbDevice()157*6777b538SAndroid Build Coastguard Worker bool SysInfo::Is4GbDevice() {
158*6777b538SAndroid Build Coastguard Worker return GetCachedSystemRamBucketizedSize() == BucketizedSize::k4Gb;
159*6777b538SAndroid Build Coastguard Worker }
160*6777b538SAndroid Build Coastguard Worker
Is4GbOr6GbDevice()161*6777b538SAndroid Build Coastguard Worker bool SysInfo::Is4GbOr6GbDevice() {
162*6777b538SAndroid Build Coastguard Worker return GetCachedSystemRamBucketizedSize() == BucketizedSize::k4Gb ||
163*6777b538SAndroid Build Coastguard Worker GetCachedSystemRamBucketizedSize() == BucketizedSize::k6Gb;
164*6777b538SAndroid Build Coastguard Worker }
165*6777b538SAndroid Build Coastguard Worker
Is6GbDevice()166*6777b538SAndroid Build Coastguard Worker bool SysInfo::Is6GbDevice() {
167*6777b538SAndroid Build Coastguard Worker return GetCachedSystemRamBucketizedSize() == BucketizedSize::k6Gb;
168*6777b538SAndroid Build Coastguard Worker }
169*6777b538SAndroid Build Coastguard Worker
170*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS)
171*6777b538SAndroid Build Coastguard Worker
172*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/1434873): This method is for chromium native code.
173*6777b538SAndroid Build Coastguard Worker // We need to update the java-side code, i.e.
174*6777b538SAndroid Build Coastguard Worker // base/android/java/src/org/chromium/base/SysUtils.java,
175*6777b538SAndroid Build Coastguard Worker // and to make the selected components in java to see this feature.
IsLowEndDeviceOrPartialLowEndModeEnabled()176*6777b538SAndroid Build Coastguard Worker bool SysInfo::IsLowEndDeviceOrPartialLowEndModeEnabled() {
177*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS)
178*6777b538SAndroid Build Coastguard Worker return base::SysInfo::IsLowEndDevice() ||
179*6777b538SAndroid Build Coastguard Worker IsPartialLowEndModeOnMidRangeDevicesEnabled() ||
180*6777b538SAndroid Build Coastguard Worker IsPartialLowEndModeOn3GbDevicesEnabled();
181*6777b538SAndroid Build Coastguard Worker #else
182*6777b538SAndroid Build Coastguard Worker return base::SysInfo::IsLowEndDevice();
183*6777b538SAndroid Build Coastguard Worker #endif
184*6777b538SAndroid Build Coastguard Worker }
185*6777b538SAndroid Build Coastguard Worker
IsLowEndDeviceOrPartialLowEndModeEnabled(const FeatureParam<bool> & param_for_exclusion)186*6777b538SAndroid Build Coastguard Worker bool SysInfo::IsLowEndDeviceOrPartialLowEndModeEnabled(
187*6777b538SAndroid Build Coastguard Worker const FeatureParam<bool>& param_for_exclusion) {
188*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS)
189*6777b538SAndroid Build Coastguard Worker return base::SysInfo::IsLowEndDevice() ||
190*6777b538SAndroid Build Coastguard Worker ((IsPartialLowEndModeOnMidRangeDevicesEnabled() ||
191*6777b538SAndroid Build Coastguard Worker IsPartialLowEndModeOn3GbDevicesEnabled()) &&
192*6777b538SAndroid Build Coastguard Worker !param_for_exclusion.Get());
193*6777b538SAndroid Build Coastguard Worker #else
194*6777b538SAndroid Build Coastguard Worker return base::SysInfo::IsLowEndDevice();
195*6777b538SAndroid Build Coastguard Worker #endif
196*6777b538SAndroid Build Coastguard Worker }
197*6777b538SAndroid Build Coastguard Worker
198*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_ANDROID)
199*6777b538SAndroid Build Coastguard Worker // The Android equivalent of this lives in `detectLowEndDevice()` at:
200*6777b538SAndroid Build Coastguard Worker // base/android/java/src/org/chromium/base/SysUtils.java
DetectLowEndDevice()201*6777b538SAndroid Build Coastguard Worker bool DetectLowEndDevice() {
202*6777b538SAndroid Build Coastguard Worker CommandLine* command_line = CommandLine::ForCurrentProcess();
203*6777b538SAndroid Build Coastguard Worker if (command_line->HasSwitch(switches::kEnableLowEndDeviceMode))
204*6777b538SAndroid Build Coastguard Worker return true;
205*6777b538SAndroid Build Coastguard Worker if (command_line->HasSwitch(switches::kDisableLowEndDeviceMode))
206*6777b538SAndroid Build Coastguard Worker return false;
207*6777b538SAndroid Build Coastguard Worker
208*6777b538SAndroid Build Coastguard Worker int ram_size_mb = SysInfo::AmountOfPhysicalMemoryMB();
209*6777b538SAndroid Build Coastguard Worker return ram_size_mb > 0 &&
210*6777b538SAndroid Build Coastguard Worker static_cast<uint64_t>(ram_size_mb) <= kLowMemoryDeviceThresholdMB;
211*6777b538SAndroid Build Coastguard Worker }
212*6777b538SAndroid Build Coastguard Worker
213*6777b538SAndroid Build Coastguard Worker // static
IsLowEndDeviceImpl()214*6777b538SAndroid Build Coastguard Worker bool SysInfo::IsLowEndDeviceImpl() {
215*6777b538SAndroid Build Coastguard Worker static internal::LazySysInfoValue<bool, DetectLowEndDevice> instance;
216*6777b538SAndroid Build Coastguard Worker return instance.value();
217*6777b538SAndroid Build Coastguard Worker }
218*6777b538SAndroid Build Coastguard Worker #endif
219*6777b538SAndroid Build Coastguard Worker
220*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_APPLE) && !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_WIN) && \
221*6777b538SAndroid Build Coastguard Worker !BUILDFLAG(IS_CHROMEOS)
HardwareModelName()222*6777b538SAndroid Build Coastguard Worker std::string SysInfo::HardwareModelName() {
223*6777b538SAndroid Build Coastguard Worker return std::string();
224*6777b538SAndroid Build Coastguard Worker }
225*6777b538SAndroid Build Coastguard Worker #endif
226*6777b538SAndroid Build Coastguard Worker
GetHardwareInfo(base::OnceCallback<void (HardwareInfo)> callback)227*6777b538SAndroid Build Coastguard Worker void SysInfo::GetHardwareInfo(base::OnceCallback<void(HardwareInfo)> callback) {
228*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
229*6777b538SAndroid Build Coastguard Worker constexpr base::TaskTraits kTraits = {base::MayBlock()};
230*6777b538SAndroid Build Coastguard Worker #else
231*6777b538SAndroid Build Coastguard Worker constexpr base::TaskTraits kTraits = {};
232*6777b538SAndroid Build Coastguard Worker #endif
233*6777b538SAndroid Build Coastguard Worker
234*6777b538SAndroid Build Coastguard Worker base::ThreadPool::PostTaskAndReplyWithResult(
235*6777b538SAndroid Build Coastguard Worker FROM_HERE, kTraits, base::BindOnce(&GetHardwareInfoSync),
236*6777b538SAndroid Build Coastguard Worker std::move(callback));
237*6777b538SAndroid Build Coastguard Worker }
238*6777b538SAndroid Build Coastguard Worker
239*6777b538SAndroid Build Coastguard Worker // static
Uptime()240*6777b538SAndroid Build Coastguard Worker base::TimeDelta SysInfo::Uptime() {
241*6777b538SAndroid Build Coastguard Worker // This code relies on an implementation detail of TimeTicks::Now() - that
242*6777b538SAndroid Build Coastguard Worker // its return value happens to coincide with the system uptime value in
243*6777b538SAndroid Build Coastguard Worker // microseconds, on Win/Mac/iOS/Linux/ChromeOS and Android.
244*6777b538SAndroid Build Coastguard Worker int64_t uptime_in_microseconds = TimeTicks::Now().ToInternalValue();
245*6777b538SAndroid Build Coastguard Worker return base::Microseconds(uptime_in_microseconds);
246*6777b538SAndroid Build Coastguard Worker }
247*6777b538SAndroid Build Coastguard Worker
248*6777b538SAndroid Build Coastguard Worker // static
ProcessCPUArchitecture()249*6777b538SAndroid Build Coastguard Worker std::string SysInfo::ProcessCPUArchitecture() {
250*6777b538SAndroid Build Coastguard Worker #if defined(ARCH_CPU_X86)
251*6777b538SAndroid Build Coastguard Worker return "x86";
252*6777b538SAndroid Build Coastguard Worker #elif defined(ARCH_CPU_X86_64)
253*6777b538SAndroid Build Coastguard Worker return "x86_64";
254*6777b538SAndroid Build Coastguard Worker #elif defined(ARCH_CPU_ARMEL)
255*6777b538SAndroid Build Coastguard Worker return "ARM";
256*6777b538SAndroid Build Coastguard Worker #elif defined(ARCH_CPU_ARM64)
257*6777b538SAndroid Build Coastguard Worker return "ARM_64";
258*6777b538SAndroid Build Coastguard Worker #elif defined(ARCH_CPU_RISCV64)
259*6777b538SAndroid Build Coastguard Worker return "RISCV_64";
260*6777b538SAndroid Build Coastguard Worker #else
261*6777b538SAndroid Build Coastguard Worker return std::string();
262*6777b538SAndroid Build Coastguard Worker #endif
263*6777b538SAndroid Build Coastguard Worker }
264*6777b538SAndroid Build Coastguard Worker
265*6777b538SAndroid Build Coastguard Worker // static
SetAmountOfPhysicalMemoryMbForTesting(const uint64_t amount_of_memory_mb)266*6777b538SAndroid Build Coastguard Worker std::optional<uint64_t> SysInfo::SetAmountOfPhysicalMemoryMbForTesting(
267*6777b538SAndroid Build Coastguard Worker const uint64_t amount_of_memory_mb) {
268*6777b538SAndroid Build Coastguard Worker std::optional<uint64_t> current = g_amount_of_physical_memory_mb_for_testing;
269*6777b538SAndroid Build Coastguard Worker g_amount_of_physical_memory_mb_for_testing.emplace(amount_of_memory_mb);
270*6777b538SAndroid Build Coastguard Worker return current;
271*6777b538SAndroid Build Coastguard Worker }
272*6777b538SAndroid Build Coastguard Worker
273*6777b538SAndroid Build Coastguard Worker // static
ClearAmountOfPhysicalMemoryMbForTesting()274*6777b538SAndroid Build Coastguard Worker void SysInfo::ClearAmountOfPhysicalMemoryMbForTesting() {
275*6777b538SAndroid Build Coastguard Worker g_amount_of_physical_memory_mb_for_testing.reset();
276*6777b538SAndroid Build Coastguard Worker }
277*6777b538SAndroid Build Coastguard Worker
278*6777b538SAndroid Build Coastguard Worker } // namespace base
279