/** * @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; }