1/**
2 * @file oprof_start_config.cpp
3 * GUI startup config management
4 *
5 * @remark Copyright 2002 OProfile authors
6 * @remark Read the file COPYING
7 *
8 * @author John Levon
9 * @author Philippe Elie
10 */
11
12#include <stdio.h>
13
14#include <sstream>
15#include <fstream>
16#include <iomanip>
17#include <sys/utsname.h>
18
19#include "string_manip.h"
20#include "oprof_start_config.h"
21#include "op_config.h"
22#include "op_config_24.h"
23
24using namespace std;
25
26event_setting::event_setting()
27	:
28	count(0),
29	umask(0),
30	os_ring_count(0),
31	user_ring_count(0)
32{
33}
34
35
36config_setting::config_setting()
37	:
38	buffer_size(OP_DEFAULT_BUF_SIZE),
39	note_table_size(OP_DEFAULT_NOTE_SIZE),
40	no_kernel(false),
41	verbose(false),
42	separate_lib(false),
43	separate_kernel(false),
44	separate_cpu(false),
45	separate_thread(false),
46	callgraph_depth(0),
47	buffer_watershed(0),
48	cpu_buffer_size(0)
49{
50	struct utsname info;
51
52	/* Guess path to vmlinux based on kernel currently running. */
53	if (uname(&info)) {
54		perror("oprof_start: Unable to determine OS release.");
55	} else {
56		string const version(info.release);
57		string const vmlinux_path("/lib/modules/" + version
58					 + "/build/vmlinux");
59		kernel_filename = vmlinux_path;
60	}
61}
62
63
64void config_setting::load(istream & in)
65{
66	buffer_size = OP_DEFAULT_BUF_SIZE;
67	note_table_size = OP_DEFAULT_NOTE_SIZE;
68
69	string str;
70
71	while (getline(in, str)) {
72		string val = split(str, '=');
73		if (str == "BUF_SIZE") {
74			buffer_size = op_lexical_cast<unsigned int>(val);
75			if (buffer_size < OP_DEFAULT_BUF_SIZE)
76				buffer_size = OP_DEFAULT_BUF_SIZE;
77		} else if (str == "NOTE_SIZE") {
78			note_table_size = op_lexical_cast<unsigned int>(val);
79			if (note_table_size < OP_DEFAULT_NOTE_SIZE)
80				note_table_size = OP_DEFAULT_NOTE_SIZE;
81		} else if (str == "VMLINUX") {
82			if (val == "none") {
83				kernel_filename = "";
84				no_kernel = true;
85			} else if (!val.empty()) {
86				no_kernel = false;
87				kernel_filename = val;
88			}
89		} else if (str == "SEPARATE_LIB") {
90			separate_lib = op_lexical_cast<bool>(val);
91		} else if (str == "SEPARATE_KERNEL") {
92			separate_kernel = op_lexical_cast<bool>(val);
93		} else if (str == "SEPARATE_CPU") {
94			separate_cpu = op_lexical_cast<bool>(val);
95		} else if (str == "SEPARATE_THREAD") {
96			separate_thread = op_lexical_cast<bool>(val);
97		} else if (str == "CALLGRAPH") {
98			callgraph_depth = op_lexical_cast<unsigned int>(val);
99		} else if (str == "BUF_WATERSHED") {
100			buffer_watershed = op_lexical_cast<unsigned int>(val);
101		} else if (str == "CPU_BUF_SIZE") {
102			cpu_buffer_size = op_lexical_cast<unsigned int>(val);
103		}
104	}
105}
106
107
108istream & operator>>(istream & in, config_setting & object)
109{
110	object.load(in);
111	return in;
112}
113