Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / extensions / browser / api / system_cpu / cpu_info_provider.cc
blob59a615711b220511d4cd24aeb4c8b7d7744700b3
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.
5 #include "extensions/browser/api/system_cpu/cpu_info_provider.h"
7 #include "base/sys_info.h"
9 namespace extensions {
11 using api::system_cpu::CpuInfo;
13 // Static member intialization.
14 base::LazyInstance<scoped_refptr<CpuInfoProvider> > CpuInfoProvider::provider_ =
15 LAZY_INSTANCE_INITIALIZER;
17 CpuInfoProvider::CpuInfoProvider() {
20 CpuInfoProvider::~CpuInfoProvider() {
23 void CpuInfoProvider::InitializeForTesting(
24 scoped_refptr<CpuInfoProvider> provider) {
25 DCHECK(provider.get() != NULL);
26 provider_.Get() = provider;
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();
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<api::system_cpu::ProcessorInfo>(
39 new api::system_cpu::ProcessorInfo()));
41 // Initialize the ProcessorInfos, or return an empty array if that fails.
42 if (!QueryCpuTimePerProcessor(&info_.processors))
43 info_.processors.clear();
44 return true;
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;
69 // static
70 CpuInfoProvider* CpuInfoProvider::Get() {
71 if (provider_.Get().get() == NULL)
72 provider_.Get() = new CpuInfoProvider();
73 return provider_.Get().get();
76 } // namespace extensions