/**
* @file oprof_start_config.cpp
* GUI startup config management
*
* @remark Copyright 2002 OProfile authors
* @remark Read the file COPYING
*
* @author John Levon
* @author Philippe Elie
*/
#include <stdio.h>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <sys/utsname.h>
#include "string_manip.h"
#include "oprof_start_config.h"
#include "op_config.h"
#include "op_config_24.h"
using namespace std;
event_setting::event_setting()
:
count(0),
umask(0),
os_ring_count(0),
user_ring_count(0)
{
}
config_setting::config_setting()
:
buffer_size(OP_DEFAULT_BUF_SIZE),
note_table_size(OP_DEFAULT_NOTE_SIZE),
no_kernel(false),
verbose(false),
separate_lib(false),
separate_kernel(false),
separate_cpu(false),
separate_thread(false),
callgraph_depth(0),
buffer_watershed(0),
cpu_buffer_size(0)
{
struct utsname info;
/* Guess path to vmlinux based on kernel currently running. */
if (uname(&info)) {
perror("oprof_start: Unable to determine OS release.");
} else {
string const version(info.release);
string const vmlinux_path("/lib/modules/" + version
+ "/build/vmlinux");
kernel_filename = vmlinux_path;
}
}
void config_setting::load(istream & in)
{
buffer_size = OP_DEFAULT_BUF_SIZE;
note_table_size = OP_DEFAULT_NOTE_SIZE;
string str;
while (getline(in, str)) {
string val = split(str, '=');
if (str == "BUF_SIZE") {
buffer_size = op_lexical_cast<unsigned int>(val);
if (buffer_size < OP_DEFAULT_BUF_SIZE)
buffer_size = OP_DEFAULT_BUF_SIZE;
} else if (str == "NOTE_SIZE") {
note_table_size = op_lexical_cast<unsigned int>(val);
if (note_table_size < OP_DEFAULT_NOTE_SIZE)
note_table_size = OP_DEFAULT_NOTE_SIZE;
} else if (str == "VMLINUX") {
if (val == "none") {
kernel_filename = "";
no_kernel = true;
} else if (!val.empty()) {
no_kernel = false;
kernel_filename = val;
}
} else if (str == "SEPARATE_LIB") {
separate_lib = op_lexical_cast<bool>(val);
} else if (str == "SEPARATE_KERNEL") {
separate_kernel = op_lexical_cast<bool>(val);
} else if (str == "SEPARATE_CPU") {
separate_cpu = op_lexical_cast<bool>(val);
} else if (str == "SEPARATE_THREAD") {
separate_thread = op_lexical_cast<bool>(val);
} else if (str == "CALLGRAPH") {
callgraph_depth = op_lexical_cast<unsigned int>(val);
} else if (str == "BUF_WATERSHED") {
buffer_watershed = op_lexical_cast<unsigned int>(val);
} else if (str == "CPU_BUF_SIZE") {
cpu_buffer_size = op_lexical_cast<unsigned int>(val);
}
}
}
istream & operator>>(istream & in, config_setting & object)
{
object.load(in);
return in;
}