| Index: webrtc/base/linux.cc
|
| diff --git a/webrtc/base/linux.cc b/webrtc/base/linux.cc
|
| deleted file mode 100644
|
| index 0894d39c7716a50c5e20b1f75aef80ac25922a86..0000000000000000000000000000000000000000
|
| --- a/webrtc/base/linux.cc
|
| +++ /dev/null
|
| @@ -1,264 +0,0 @@
|
| -/*
|
| - * Copyright 2008 The WebRTC Project Authors. All rights reserved.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license
|
| - * that can be found in the LICENSE file in the root of the source
|
| - * tree. An additional intellectual property rights grant can be found
|
| - * in the file PATENTS. All contributing project authors may
|
| - * be found in the AUTHORS file in the root of the source tree.
|
| - */
|
| -
|
| -#if defined(WEBRTC_LINUX)
|
| -#include "webrtc/base/linux.h"
|
| -
|
| -#include <ctype.h>
|
| -
|
| -#include <errno.h>
|
| -#include <sys/utsname.h>
|
| -#include <sys/wait.h>
|
| -
|
| -#include <cstdio>
|
| -#include <set>
|
| -
|
| -#include "webrtc/base/stringencode.h"
|
| -
|
| -namespace rtc {
|
| -
|
| -static const char kCpuInfoFile[] = "/proc/cpuinfo";
|
| -static const char kCpuMaxFreqFile[] =
|
| - "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq";
|
| -
|
| -ProcCpuInfo::ProcCpuInfo() {
|
| -}
|
| -
|
| -ProcCpuInfo::~ProcCpuInfo() {
|
| -}
|
| -
|
| -bool ProcCpuInfo::LoadFromSystem() {
|
| - ConfigParser procfs;
|
| - if (!procfs.Open(kCpuInfoFile)) {
|
| - return false;
|
| - }
|
| - return procfs.Parse(§ions_);
|
| -};
|
| -
|
| -bool ProcCpuInfo::GetSectionCount(size_t* count) {
|
| - if (sections_.empty()) {
|
| - return false;
|
| - }
|
| - if (count) {
|
| - *count = sections_.size();
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -bool ProcCpuInfo::GetNumCpus(int* num) {
|
| - if (sections_.empty()) {
|
| - return false;
|
| - }
|
| - int total_cpus = 0;
|
| -#if defined(__arm__)
|
| - // Count the number of blocks that have a "processor" key defined. On ARM,
|
| - // there may be extra blocks of information that aren't per-processor.
|
| - size_t section_count = sections_.size();
|
| - for (size_t i = 0; i < section_count; ++i) {
|
| - int processor_id;
|
| - if (GetSectionIntValue(i, "processor", &processor_id)) {
|
| - ++total_cpus;
|
| - }
|
| - }
|
| - // Single core ARM systems don't include "processor" keys at all, so return
|
| - // that we have a single core if we didn't find any explicitly above.
|
| - if (total_cpus == 0) {
|
| - total_cpus = 1;
|
| - }
|
| -#else
|
| - // On X86, there is exactly one info section per processor.
|
| - total_cpus = static_cast<int>(sections_.size());
|
| -#endif
|
| - if (num) {
|
| - *num = total_cpus;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -bool ProcCpuInfo::GetNumPhysicalCpus(int* num) {
|
| - if (sections_.empty()) {
|
| - return false;
|
| - }
|
| - // TODO: /proc/cpuinfo only reports cores that are currently
|
| - // _online_, so this may underreport the number of physical cores.
|
| -#if defined(__arm__)
|
| - // ARM (currently) has no hyperthreading, so just return the same value
|
| - // as GetNumCpus.
|
| - return GetNumCpus(num);
|
| -#else
|
| - int total_cores = 0;
|
| - std::set<int> physical_ids;
|
| - size_t section_count = sections_.size();
|
| - for (size_t i = 0; i < section_count; ++i) {
|
| - int physical_id;
|
| - int cores;
|
| - // Count the cores for the physical id only if we have not counted the id.
|
| - if (GetSectionIntValue(i, "physical id", &physical_id) &&
|
| - GetSectionIntValue(i, "cpu cores", &cores) &&
|
| - physical_ids.find(physical_id) == physical_ids.end()) {
|
| - physical_ids.insert(physical_id);
|
| - total_cores += cores;
|
| - }
|
| - }
|
| -
|
| - if (num) {
|
| - *num = total_cores;
|
| - }
|
| - return true;
|
| -#endif
|
| -}
|
| -
|
| -bool ProcCpuInfo::GetCpuFamily(int* id) {
|
| - int cpu_family = 0;
|
| -
|
| -#if defined(__arm__)
|
| - // On some ARM platforms, there is no 'cpu family' in '/proc/cpuinfo'. But
|
| - // there is 'CPU Architecture' which can be used as 'cpu family'.
|
| - // See http://en.wikipedia.org/wiki/ARM_architecture for a good list of
|
| - // ARM cpu families, architectures, and their mappings.
|
| - // There may be multiple sessions that aren't per-processor. We need to scan
|
| - // through each session until we find the first 'CPU architecture'.
|
| - size_t section_count = sections_.size();
|
| - for (size_t i = 0; i < section_count; ++i) {
|
| - if (GetSectionIntValue(i, "CPU architecture", &cpu_family)) {
|
| - // We returns the first one (if there are multiple entries).
|
| - break;
|
| - };
|
| - }
|
| -#else
|
| - GetSectionIntValue(0, "cpu family", &cpu_family);
|
| -#endif
|
| - if (id) {
|
| - *id = cpu_family;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -bool ProcCpuInfo::GetSectionStringValue(size_t section_num,
|
| - const std::string& key,
|
| - std::string* result) {
|
| - if (section_num >= sections_.size()) {
|
| - return false;
|
| - }
|
| - ConfigParser::SimpleMap::iterator iter = sections_[section_num].find(key);
|
| - if (iter == sections_[section_num].end()) {
|
| - return false;
|
| - }
|
| - *result = iter->second;
|
| - return true;
|
| -}
|
| -
|
| -bool ProcCpuInfo::GetSectionIntValue(size_t section_num,
|
| - const std::string& key,
|
| - int* result) {
|
| - if (section_num >= sections_.size()) {
|
| - return false;
|
| - }
|
| - ConfigParser::SimpleMap::iterator iter = sections_[section_num].find(key);
|
| - if (iter == sections_[section_num].end()) {
|
| - return false;
|
| - }
|
| - return FromString(iter->second, result);
|
| -}
|
| -
|
| -ConfigParser::ConfigParser() {}
|
| -
|
| -ConfigParser::~ConfigParser() {}
|
| -
|
| -bool ConfigParser::Open(const std::string& filename) {
|
| - FileStream* fs = new FileStream();
|
| - if (!fs->Open(filename, "r", NULL)) {
|
| - return false;
|
| - }
|
| - instream_.reset(fs);
|
| - return true;
|
| -}
|
| -
|
| -void ConfigParser::Attach(StreamInterface* stream) {
|
| - instream_.reset(stream);
|
| -}
|
| -
|
| -bool ConfigParser::Parse(MapVector* key_val_pairs) {
|
| - // Parses the file and places the found key-value pairs into key_val_pairs.
|
| - SimpleMap section;
|
| - while (ParseSection(§ion)) {
|
| - key_val_pairs->push_back(section);
|
| - section.clear();
|
| - }
|
| - return (!key_val_pairs->empty());
|
| -}
|
| -
|
| -bool ConfigParser::ParseSection(SimpleMap* key_val_pair) {
|
| - // Parses the next section in the filestream and places the found key-value
|
| - // pairs into key_val_pair.
|
| - std::string key, value;
|
| - while (ParseLine(&key, &value)) {
|
| - (*key_val_pair)[key] = value;
|
| - }
|
| - return (!key_val_pair->empty());
|
| -}
|
| -
|
| -bool ConfigParser::ParseLine(std::string* key, std::string* value) {
|
| - // Parses the next line in the filestream and places the found key-value
|
| - // pair into key and val.
|
| - std::string line;
|
| - if ((instream_->ReadLine(&line)) == SR_EOS) {
|
| - return false;
|
| - }
|
| - std::vector<std::string> tokens;
|
| - if (2 != split(line, ':', &tokens)) {
|
| - return false;
|
| - }
|
| - // Removes whitespace at the end of Key name
|
| - size_t pos = tokens[0].length() - 1;
|
| - while ((pos > 0) && isspace(tokens[0][pos])) {
|
| - pos--;
|
| - }
|
| - tokens[0].erase(pos + 1);
|
| - // Removes whitespace at the start of value
|
| - pos = 0;
|
| - while (pos < tokens[1].length() && isspace(tokens[1][pos])) {
|
| - pos++;
|
| - }
|
| - tokens[1].erase(0, pos);
|
| - *key = tokens[0];
|
| - *value = tokens[1];
|
| - return true;
|
| -}
|
| -
|
| -std::string ReadLinuxUname() {
|
| - struct utsname buf;
|
| - if (uname(&buf) < 0) {
|
| - LOG_ERR(LS_ERROR) << "Can't call uname()";
|
| - return std::string();
|
| - }
|
| - std::ostringstream sstr;
|
| - sstr << buf.sysname << " "
|
| - << buf.release << " "
|
| - << buf.version << " "
|
| - << buf.machine;
|
| - return sstr.str();
|
| -}
|
| -
|
| -int ReadCpuMaxFreq() {
|
| - FileStream fs;
|
| - std::string str;
|
| - int freq = -1;
|
| - if (!fs.Open(kCpuMaxFreqFile, "r", NULL) ||
|
| - SR_SUCCESS != fs.ReadLine(&str) ||
|
| - !FromString(str, &freq)) {
|
| - return -1;
|
| - }
|
| - return freq;
|
| -}
|
| -
|
| -} // namespace rtc
|
| -
|
| -#endif // defined(WEBRTC_LINUX)
|
|
|