19ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/system_cpu/cpu_info_provider.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_info.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing core_api::system_cpu::CpuInfo; 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Static member intialization. 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::LazyInstance<scoped_refptr<CpuInfoProvider> > CpuInfoProvider::provider_ = 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci LAZY_INSTANCE_INITIALIZER; 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciCpuInfoProvider::CpuInfoProvider() { 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciCpuInfoProvider::~CpuInfoProvider() { 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochvoid CpuInfoProvider::InitializeForTesting( 24bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch scoped_refptr<CpuInfoProvider> provider) { 25bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch DCHECK(provider.get() != NULL); 26bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch provider_.Get() = provider; 27bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 28bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool CpuInfoProvider::QueryInfo() { 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch info_.num_of_processors = base::SysInfo::NumberOfProcessors(); 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch info_.arch_name = base::SysInfo::OperatingSystemArchitecture(); 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch info_.model_name = base::SysInfo::CPUModelName(); 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info_.features = GetFeatures(); 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info_.processors.clear(); 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Fill in the correct number of uninitialized ProcessorInfos. 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (int i = 0; i < info_.num_of_processors; ++i) { 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci info_.processors.push_back(linked_ptr<core_api::system_cpu::ProcessorInfo>( 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new core_api::system_cpu::ProcessorInfo())); 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Initialize the ProcessorInfos, or return an empty array if that fails. 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!QueryCpuTimePerProcessor(&info_.processors)) 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info_.processors.clear(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::vector<std::string> CpuInfoProvider::GetFeatures() const { 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<std::string> features; 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // These are the feature codes used by /proc/cpuinfo on Linux. 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (cpu_.has_mmx()) 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci features.push_back("mmx"); 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (cpu_.has_sse()) 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci features.push_back("sse"); 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (cpu_.has_sse2()) 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci features.push_back("sse2"); 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (cpu_.has_sse3()) 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci features.push_back("sse3"); 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (cpu_.has_ssse3()) 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci features.push_back("ssse3"); 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (cpu_.has_sse41()) 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci features.push_back("sse4_1"); 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (cpu_.has_sse42()) 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci features.push_back("sse4_2"); 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (cpu_.has_avx()) 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci features.push_back("avx"); 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return features; 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CpuInfoProvider* CpuInfoProvider::Get() { 71bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (provider_.Get().get() == NULL) 72bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch provider_.Get() = new CpuInfoProvider(); 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return provider_.Get().get(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 77