1 // Copyright 2013 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 "extensions/browser/api/system_cpu/cpu_info_provider.h" 6 7 #include "base/sys_info.h" 8 9 namespace extensions { 10 11 using core_api::system_cpu::CpuInfo; 12 13 // Static member intialization. 14 base::LazyInstance<scoped_refptr<CpuInfoProvider> > CpuInfoProvider::provider_ = 15 LAZY_INSTANCE_INITIALIZER; 16 17 CpuInfoProvider::CpuInfoProvider() { 18 } 19 20 CpuInfoProvider::~CpuInfoProvider() { 21 } 22 23 void CpuInfoProvider::InitializeForTesting( 24 scoped_refptr<CpuInfoProvider> provider) { 25 DCHECK(provider.get() != NULL); 26 provider_.Get() = provider; 27 } 28 29 bool CpuInfoProvider::QueryInfo() { 30 info_.num_of_processors = base::SysInfo::NumberOfProcessors(); 31 info_.arch_name = base::SysInfo::OperatingSystemArchitecture(); 32 info_.model_name = base::SysInfo::CPUModelName(); 33 info_.features = GetFeatures(); 34 35 info_.processors.clear(); 36 // Fill in the correct number of uninitialized ProcessorInfos. 37 for (int i = 0; i < info_.num_of_processors; ++i) { 38 info_.processors.push_back(linked_ptr<core_api::system_cpu::ProcessorInfo>( 39 new core_api::system_cpu::ProcessorInfo())); 40 } 41 // Initialize the ProcessorInfos, or return an empty array if that fails. 42 if (!QueryCpuTimePerProcessor(&info_.processors)) 43 info_.processors.clear(); 44 return true; 45 } 46 47 std::vector<std::string> CpuInfoProvider::GetFeatures() const { 48 std::vector<std::string> features; 49 // These are the feature codes used by /proc/cpuinfo on Linux. 50 if (cpu_.has_mmx()) 51 features.push_back("mmx"); 52 if (cpu_.has_sse()) 53 features.push_back("sse"); 54 if (cpu_.has_sse2()) 55 features.push_back("sse2"); 56 if (cpu_.has_sse3()) 57 features.push_back("sse3"); 58 if (cpu_.has_ssse3()) 59 features.push_back("ssse3"); 60 if (cpu_.has_sse41()) 61 features.push_back("sse4_1"); 62 if (cpu_.has_sse42()) 63 features.push_back("sse4_2"); 64 if (cpu_.has_avx()) 65 features.push_back("avx"); 66 return features; 67 } 68 69 // static 70 CpuInfoProvider* CpuInfoProvider::Get() { 71 if (provider_.Get().get() == NULL) 72 provider_.Get() = new CpuInfoProvider(); 73 return provider_.Get().get(); 74 } 75 76 } // namespace extensions 77