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