blob: 351704d7e59fe14d300fbe2a7f5b985d5109951a [file] [log] [blame]
[email protected]0f24e53e2012-10-29 01:04:091// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/sys_info.h"
6
[email protected]35b4f0c2014-06-26 16:55:277#include "base/base_switches.h"
8#include "base/command_line.h"
9#include "base/lazy_instance.h"
cnwand4270e82015-05-06 06:11:4510#include "base/metrics/field_trial.h"
[email protected]35b4f0c2014-06-26 16:55:2711#include "base/strings/string_number_conversions.h"
cnwand4270e82015-05-06 06:11:4512#include "base/strings/string_util.h"
[email protected]35b4f0c2014-06-26 16:55:2713#include "base/sys_info_internal.h"
[email protected]8f9a3a52013-06-28 15:14:1814#include "base/time/time.h"
avi9b6f42932015-12-26 22:15:1415#include "build/build_config.h"
[email protected]0f24e53e2012-10-29 01:04:0916
17namespace base {
Eric Karla628c092017-07-26 01:18:3718namespace {
19static const int kLowMemoryDeviceThresholdMB = 512;
20}
21
22// static
23int64_t SysInfo::AmountOfPhysicalMemory() {
24 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
25 switches::kEnableLowEndDeviceMode)) {
26 return kLowMemoryDeviceThresholdMB * 1024 * 1024;
27 }
28
29 return AmountOfPhysicalMemoryImpl();
30}
31
32// static
33int64_t SysInfo::AmountOfAvailablePhysicalMemory() {
34 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
35 switches::kEnableLowEndDeviceMode)) {
36 // Estimate the available memory by subtracting our memory used estimate
37 // from the fake |kLowMemoryDeviceThresholdMB| limit.
38 size_t memory_used =
39 AmountOfPhysicalMemoryImpl() - AmountOfAvailablePhysicalMemoryImpl();
40 size_t memory_limit = kLowMemoryDeviceThresholdMB * 1024 * 1024;
41 // std::min ensures no underflow, as |memory_used| can be > |memory_limit|.
42 return memory_limit - std::min(memory_used, memory_limit);
43 }
44
45 return AmountOfAvailablePhysicalMemoryImpl();
46}
[email protected]0f24e53e2012-10-29 01:04:0947
[email protected]35b4f0c2014-06-26 16:55:2748#if !defined(OS_ANDROID)
49
[email protected]35b4f0c2014-06-26 16:55:2750bool DetectLowEndDevice() {
51 CommandLine* command_line = CommandLine::ForCurrentProcess();
ssidfeb3f47d2014-12-16 16:04:0252 if (command_line->HasSwitch(switches::kEnableLowEndDeviceMode))
[email protected]35b4f0c2014-06-26 16:55:2753 return true;
ssidfeb3f47d2014-12-16 16:04:0254 if (command_line->HasSwitch(switches::kDisableLowEndDeviceMode))
[email protected]35b4f0c2014-06-26 16:55:2755 return false;
56
57 int ram_size_mb = SysInfo::AmountOfPhysicalMemoryMB();
mariakhomenko0064e5e2016-04-28 19:25:3358 return (ram_size_mb > 0 && ram_size_mb <= kLowMemoryDeviceThresholdMB);
[email protected]35b4f0c2014-06-26 16:55:2759}
60
61static LazyInstance<
62 internal::LazySysInfoValue<bool, DetectLowEndDevice> >::Leaky
63 g_lazy_low_end_device = LAZY_INSTANCE_INITIALIZER;
64
65// static
66bool SysInfo::IsLowEndDevice() {
cnwand4270e82015-05-06 06:11:4567 const std::string group_name =
68 base::FieldTrialList::FindFullName("MemoryReduction");
69
70 // Low End Device Mode will be enabled if this client is assigned to
71 // one of those EnabledXXX groups.
brettw89365dc2015-06-16 05:52:4772 if (StartsWith(group_name, "Enabled", CompareCase::SENSITIVE))
cnwand4270e82015-05-06 06:11:4573 return true;
74
[email protected]35b4f0c2014-06-26 16:55:2775 return g_lazy_low_end_device.Get().value();
76}
77#endif
78
asvitkine666e5ee2017-05-04 22:52:0079#if !defined(OS_MACOSX) && !defined(OS_ANDROID)
jeremyba4eca92014-11-06 18:47:1080std::string SysInfo::HardwareModelName() {
81 return std::string();
82}
83#endif
84
[email protected]0f24e53e2012-10-29 01:04:0985// static
sque0f78ba542015-11-05 00:01:0386base::TimeDelta SysInfo::Uptime() {
[email protected]0f24e53e2012-10-29 01:04:0987 // This code relies on an implementation detail of TimeTicks::Now() - that
88 // its return value happens to coincide with the system uptime value in
89 // microseconds, on Win/Mac/iOS/Linux/ChromeOS and Android.
avidd4e614352015-12-09 00:44:4990 int64_t uptime_in_microseconds = TimeTicks::Now().ToInternalValue();
sque0f78ba542015-11-05 00:01:0391 return base::TimeDelta::FromMicroseconds(uptime_in_microseconds);
[email protected]0f24e53e2012-10-29 01:04:0992}
93
94} // namespace base