15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/*
25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle
35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2008 Google Inc.
45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without
65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met:
75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer.
105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer in the documentation
125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     and/or other materials provided with the distribution.
135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  3. The name of the author may not be used to endorse or promote products
145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     derived from this software without specific prior written permission.
155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */
275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#if defined(LINUX) || defined(ANDROID)
295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/linux.h"
305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <ctype.h>
325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <errno.h>
345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <sys/utsname.h>
355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <sys/wait.h>
365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <cstdio>
385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <set>
395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/stringencode.h"
415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace talk_base {
435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const char kCpuInfoFile[] = "/proc/cpuinfo";
455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const char kCpuMaxFreqFile[] =
465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq";
475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgProcCpuInfo::ProcCpuInfo() {
495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgProcCpuInfo::~ProcCpuInfo() {
525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ProcCpuInfo::LoadFromSystem() {
555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ConfigParser procfs;
565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!procfs.Open(kCpuInfoFile)) {
575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return procfs.Parse(&sections_);
605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ProcCpuInfo::GetSectionCount(size_t* count) {
635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (sections_.empty()) {
645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (count) {
675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *count = sections_.size();
685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return true;
705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ProcCpuInfo::GetNumCpus(int* num) {
735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (sections_.empty()) {
745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  int total_cpus = 0;
775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#if defined(__arm__)
785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Count the number of blocks that have a "processor" key defined. On ARM,
795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // there may be extra blocks of information that aren't per-processor.
805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  size_t section_count = sections_.size();
815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (size_t i = 0; i < section_count; ++i) {
825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    int processor_id;
835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (GetSectionIntValue(i, "processor", &processor_id)) {
845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ++total_cpus;
855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Single core ARM systems don't include "processor" keys at all, so return
885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // that we have a single core if we didn't find any explicitly above.
895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (total_cpus == 0) {
905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    total_cpus = 1;
915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else
935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // On X86, there is exactly one info section per processor.
945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  total_cpus = static_cast<int>(sections_.size());
955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif
965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (num) {
975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *num = total_cpus;
985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return true;
1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ProcCpuInfo::GetNumPhysicalCpus(int* num) {
1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (sections_.empty()) {
1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // TODO: /proc/cpuinfo only reports cores that are currently
1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // _online_, so this may underreport the number of physical cores.
1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#if defined(__arm__)
1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // ARM (currently) has no hyperthreading, so just return the same value
1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // as GetNumCpus.
1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return GetNumCpus(num);
1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else
1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  int total_cores = 0;
1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::set<int> physical_ids;
1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  size_t section_count = sections_.size();
1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (size_t i = 0; i < section_count; ++i) {
1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    int physical_id;
1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    int cores;
1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    // Count the cores for the physical id only if we have not counted the id.
1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (GetSectionIntValue(i, "physical id", &physical_id) &&
1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        GetSectionIntValue(i, "cpu cores", &cores) &&
1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        physical_ids.find(physical_id) == physical_ids.end()) {
1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      physical_ids.insert(physical_id);
1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      total_cores += cores;
1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (num) {
1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *num = total_cores;
1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return true;
1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif
1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ProcCpuInfo::GetCpuFamily(int* id) {
1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  int cpu_family = 0;
1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#if defined(__arm__)
1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // On some ARM platforms, there is no 'cpu family' in '/proc/cpuinfo'. But
1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // there is 'CPU Architecture' which can be used as 'cpu family'.
1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // See http://en.wikipedia.org/wiki/ARM_architecture for a good list of
1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // ARM cpu families, architectures, and their mappings.
1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // There may be multiple sessions that aren't per-processor. We need to scan
1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // through each session until we find the first 'CPU architecture'.
1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  size_t section_count = sections_.size();
1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (size_t i = 0; i < section_count; ++i) {
1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (GetSectionIntValue(i, "CPU architecture", &cpu_family)) {
1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      // We returns the first one (if there are multiple entries).
1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      break;
1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    };
1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else
1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  GetSectionIntValue(0, "cpu family", &cpu_family);
1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif
1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (id) {
1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *id = cpu_family;
1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return true;
1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ProcCpuInfo::GetSectionStringValue(size_t section_num,
1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                        const std::string& key,
1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                        std::string* result) {
1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (section_num >= sections_.size()) {
1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ConfigParser::SimpleMap::iterator iter = sections_[section_num].find(key);
1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (iter == sections_[section_num].end()) {
1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  *result = iter->second;
1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return true;
1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ProcCpuInfo::GetSectionIntValue(size_t section_num,
1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                     const std::string& key,
1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                     int* result) {
1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (section_num >= sections_.size()) {
1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ConfigParser::SimpleMap::iterator iter = sections_[section_num].find(key);
1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (iter == sections_[section_num].end()) {
1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return FromString(iter->second, result);
1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgConfigParser::ConfigParser() {}
1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgConfigParser::~ConfigParser() {}
1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ConfigParser::Open(const std::string& filename) {
1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  FileStream* fs = new FileStream();
1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!fs->Open(filename, "r", NULL)) {
1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  instream_.reset(fs);
1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return true;
1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid ConfigParser::Attach(StreamInterface* stream) {
2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  instream_.reset(stream);
2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ConfigParser::Parse(MapVector* key_val_pairs) {
2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Parses the file and places the found key-value pairs into key_val_pairs.
2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  SimpleMap section;
2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  while (ParseSection(&section)) {
2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    key_val_pairs->push_back(section);
2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    section.clear();
2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return (!key_val_pairs->empty());
2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ConfigParser::ParseSection(SimpleMap* key_val_pair) {
2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Parses the next section in the filestream and places the found key-value
2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // pairs into key_val_pair.
2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string key, value;
2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  while (ParseLine(&key, &value)) {
2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    (*key_val_pair)[key] = value;
2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return (!key_val_pair->empty());
2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ConfigParser::ParseLine(std::string* key, std::string* value) {
2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Parses the next line in the filestream and places the found key-value
2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // pair into key and val.
2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string line;
2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if ((instream_->ReadLine(&line)) == SR_EOS) {
2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::vector<std::string> tokens;
2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (2 != split(line, ':', &tokens)) {
2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Removes whitespace at the end of Key name
2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  size_t pos = tokens[0].length() - 1;
2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  while ((pos > 0) && isspace(tokens[0][pos])) {
2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    pos--;
2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  tokens[0].erase(pos + 1);
2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Removes whitespace at the start of value
2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  pos = 0;
2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  while (pos < tokens[1].length() && isspace(tokens[1][pos])) {
2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    pos++;
2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  tokens[1].erase(0, pos);
2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  *key = tokens[0];
2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  *value = tokens[1];
2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return true;
2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstd::string ReadLinuxUname() {
2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  struct utsname buf;
2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (uname(&buf) < 0) {
2575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    LOG_ERR(LS_ERROR) << "Can't call uname()";
2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return std::string();
2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::ostringstream sstr;
2615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sstr << buf.sysname << " "
2625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org       << buf.release << " "
2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org       << buf.version << " "
2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org       << buf.machine;
2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return sstr.str();
2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgint ReadCpuMaxFreq() {
2695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  FileStream fs;
2705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string str;
2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  int freq = -1;
2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!fs.Open(kCpuMaxFreqFile, "r", NULL) ||
2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      SR_SUCCESS != fs.ReadLine(&str) ||
2745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      !FromString(str, &freq)) {
2755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return -1;
2765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return freq;
2785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}  // namespace talk_base
2815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif  // defined(LINUX) || defined(ANDROID)
283