diff options
author | puttaraju.r@samsung.com <puttaraju.r@samsung.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-28 15:33:26 +0000 |
---|---|---|
committer | puttaraju.r@samsung.com <puttaraju.r@samsung.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-28 15:33:26 +0000 |
commit | 3a23f63c2ae4f56bae97806eb7f8759a8e2895a6 (patch) | |
tree | 9d36cc9534e3e5b8189b13ed919f8bd18b95ae58 /base/cpu.cc | |
parent | 146eae3d95239b048fc4f1e778f43e0f59be9b96 (diff) | |
download | chromium_src-3a23f63c2ae4f56bae97806eb7f8759a8e2895a6.zip chromium_src-3a23f63c2ae4f56bae97806eb7f8759a8e2895a6.tar.gz chromium_src-3a23f63c2ae4f56bae97806eb7f8759a8e2895a6.tar.bz2 |
Parsing /proc/cpuinfo for cpu branding information on Android and Aura.
BUG=313454
Review URL: https://codereview.chromium.org/188443003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@266575 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/cpu.cc')
-rw-r--r-- | base/cpu.cc | 57 |
1 files changed, 50 insertions, 7 deletions
diff --git a/base/cpu.cc b/base/cpu.cc index 66207a1..3fa9413 100644 --- a/base/cpu.cc +++ b/base/cpu.cc @@ -11,6 +11,11 @@ #include "base/basictypes.h" #include "build/build_config.h" +#if defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX)) +#include "base/file_util.h" +#include "base/lazy_instance.h" +#endif + #if defined(ARCH_CPU_X86_FAMILY) #if defined(_MSC_VER) #include <intrin.h> @@ -84,6 +89,49 @@ uint64 _xgetbv(uint32 xcr) { #endif // !_MSC_VER #endif // ARCH_CPU_X86_FAMILY +#if defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX)) + +std::string ParseCpuInfo() { + const char kProcessorPrefix[] = "Processor"; + std::string contents, cpu_brand; + ReadFileToString(FilePath("/proc/cpuinfo"), &contents); + DCHECK(!contents.empty()); + if (!contents.empty()) { + std::istringstream iss(contents); + std::string line; + while (std::getline(iss, line)) { + if (line.compare(0, strlen(kProcessorPrefix), kProcessorPrefix) == 0) { + size_t pos = line.find(": "); + if (pos != std::string::npos) { + cpu_brand.assign(line.substr(pos + 2)); + break; + } + } + } + } + return cpu_brand; +} + +class LazyCpuInfoValue { + public: + LazyCpuInfoValue() : value_(ParseCpuInfo()) {} + const std::string& value() { return value_; } + + private: + const std::string value_; + DISALLOW_COPY_AND_ASSIGN(LazyCpuInfoValue); +}; + +base::LazyInstance<LazyCpuInfoValue> g_lazy_cpu_brand = + LAZY_INSTANCE_INITIALIZER; + +const std::string& CpuBrandInfo() { + return g_lazy_cpu_brand.Get().value(); +} + +#endif // defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || + // defined(OS_LINUX)) + } // anonymous namespace void CPU::Initialize() { @@ -157,13 +205,8 @@ void CPU::Initialize() { __cpuid(cpu_info, parameter_containing_non_stop_time_stamp_counter); has_non_stop_time_stamp_counter_ = (cpu_info[3] & (1 << 8)) != 0; } -#elif defined(ARCH_CPU_ARM_FAMILY) - // TODO(piman): Expand this. ARM has a CPUID register, but it's not available - // in user mode. /proc/cpuinfo has some information, but it's non standard, - // platform-specific, and not accessible from the sandbox. - // For some purposes, this first approximation is enough. - // crbug.com/313454 - cpu_brand_.assign("ARM"); +#elif defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX)) + cpu_brand_.assign(CpuBrandInfo()); #endif } |