1 // 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 
7 #include "base/base_switches.h"
8 #include "base/command_line.h"
9 #include "base/lazy_instance.h"
10 #include "base/metrics/field_trial.h"
11 #include "base/strings/string_number_conversions.h"
12 #include "base/strings/string_util.h"
13 #include "base/sys_info_internal.h"
14 #include "base/time/time.h"
15 #include "build/build_config.h"
16 
17 namespace base {
18 
19 #if !defined(OS_ANDROID)
20 
21 static const int kLowMemoryDeviceThresholdMB = 512;
22 
DetectLowEndDevice()23 bool DetectLowEndDevice() {
24   CommandLine* command_line = CommandLine::ForCurrentProcess();
25   if (command_line->HasSwitch(switches::kEnableLowEndDeviceMode))
26     return true;
27   if (command_line->HasSwitch(switches::kDisableLowEndDeviceMode))
28     return false;
29 
30   int ram_size_mb = SysInfo::AmountOfPhysicalMemoryMB();
31   return (ram_size_mb > 0 && ram_size_mb < kLowMemoryDeviceThresholdMB);
32 }
33 
34 static LazyInstance<
35   internal::LazySysInfoValue<bool, DetectLowEndDevice> >::Leaky
36   g_lazy_low_end_device = LAZY_INSTANCE_INITIALIZER;
37 
38 // static
IsLowEndDevice()39 bool SysInfo::IsLowEndDevice() {
40   const std::string group_name =
41       base::FieldTrialList::FindFullName("MemoryReduction");
42 
43   // Low End Device Mode will be enabled if this client is assigned to
44   // one of those EnabledXXX groups.
45   if (StartsWith(group_name, "Enabled", CompareCase::SENSITIVE))
46     return true;
47 
48   return g_lazy_low_end_device.Get().value();
49 }
50 #endif
51 
52 #if (!defined(OS_MACOSX) || defined(OS_IOS)) && !defined(OS_ANDROID)
HardwareModelName()53 std::string SysInfo::HardwareModelName() {
54   return std::string();
55 }
56 #endif
57 
58 // static
Uptime()59 base::TimeDelta SysInfo::Uptime() {
60   // This code relies on an implementation detail of TimeTicks::Now() - that
61   // its return value happens to coincide with the system uptime value in
62   // microseconds, on Win/Mac/iOS/Linux/ChromeOS and Android.
63   int64_t uptime_in_microseconds = TimeTicks::Now().ToInternalValue();
64   return base::TimeDelta::FromMicroseconds(uptime_in_microseconds);
65 }
66 
67 }  // namespace base
68