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(§ions_); 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(§ion)) { 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