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