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 Workerint64_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 Workerint64_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 Workerbool 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 Workerbool 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 Workerbool 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 Workerstd::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 Workerbase::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