147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2008 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef WEBRTC_BASE_LINUX_H_ 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_LINUX_H_ 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_LINUX) 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <string> 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <map> 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <vector> 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/scoped_ptr.h" 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/stream.h" 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org////////////////////////////////////////////////////////////////////////////// 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// ConfigParser parses a FileStream of an ".ini."-type format into a map. 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org////////////////////////////////////////////////////////////////////////////// 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Sample Usage: 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// ConfigParser parser; 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// ConfigParser::MapVector key_val_pairs; 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// if (parser.Open(inifile) && parser.Parse(&key_val_pairs)) { 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// for (int section_num=0; i < key_val_pairs.size(); ++section_num) { 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// std::string val1 = key_val_pairs[section_num][key1]; 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// std::string val2 = key_val_pairs[section_num][key2]; 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// // Do something with valn; 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// } 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// } 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass ConfigParser { 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org typedef std::map<std::string, std::string> SimpleMap; 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org typedef std::vector<SimpleMap> MapVector; 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ConfigParser(); 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual ~ConfigParser(); 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual bool Open(const std::string& filename); 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void Attach(StreamInterface* stream); 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual bool Parse(MapVector* key_val_pairs); 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual bool ParseSection(SimpleMap* key_val_pair); 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual bool ParseLine(std::string* key, std::string* value); 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org scoped_ptr<StreamInterface> instream_; 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org////////////////////////////////////////////////////////////////////////////// 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// ProcCpuInfo reads CPU info from the /proc subsystem on any *NIX platform. 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org////////////////////////////////////////////////////////////////////////////// 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Sample Usage: 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// ProcCpuInfo proc_info; 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// int no_of_cpu; 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// if (proc_info.LoadFromSystem()) { 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// std::string out_str; 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// proc_info.GetNumCpus(&no_of_cpu); 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// proc_info.GetCpuStringValue(0, "vendor_id", &out_str); 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// } 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// } 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass ProcCpuInfo { 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ProcCpuInfo(); 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual ~ProcCpuInfo(); 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Reads the proc subsystem's cpu info into memory. If this fails, this 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // returns false; if it succeeds, it returns true. 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual bool LoadFromSystem(); 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Obtains the number of logical CPU threads and places the value num. 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual bool GetNumCpus(int* num); 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Obtains the number of physical CPU cores and places the value num. 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual bool GetNumPhysicalCpus(int* num); 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Obtains the CPU family id. 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual bool GetCpuFamily(int* id); 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Obtains the number of sections in /proc/cpuinfo, which may be greater 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // than the number of CPUs (e.g. on ARM) 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual bool GetSectionCount(size_t* count); 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Looks for the CPU proc item with the given name for the given section 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // number and places the string value in result. 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual bool GetSectionStringValue(size_t section_num, const std::string& key, 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string* result); 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Looks for the CPU proc item with the given name for the given section 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // number and places the int value in result. 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual bool GetSectionIntValue(size_t section_num, const std::string& key, 10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int* result); 10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ConfigParser::MapVector sections_; 10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 107c4a579473471db4130ac4ed742b6da027f93f1achenrike@webrtc.org#if !defined(WEBRTC_CHROMIUM_BUILD) 10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Builds a string containing the info from lsb_release on a single line. 10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstd::string ReadLinuxLsbRelease(); 11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Returns the output of "uname". 11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstd::string ReadLinuxUname(); 11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Returns the content (int) of 11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq 11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Returns -1 on error. 11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgint ReadCpuMaxFreq(); 11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // defined(WEBRTC_LINUX) 12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_BASE_LINUX_H_ 124