18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file oprof_start.cpp
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * The GUI start main class
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2002 OProfile authors
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author Philippe Elie
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author John Levon
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <sys/stat.h>
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <unistd.h>
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <ctime>
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <cstdio>
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <cmath>
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <sstream>
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <iostream>
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <fstream>
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <algorithm>
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <qlineedit.h>
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <qlistview.h>
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <qcombobox.h>
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <qlistbox.h>
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <qfiledialog.h>
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <qbuttongroup.h>
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <qcheckbox.h>
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <qtabwidget.h>
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <qmessagebox.h>
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <qvalidator.h>
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <qlabel.h>
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <qpushbutton.h>
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <qheader.h>
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "config.h"
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "oprof_start.h"
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_config.h"
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_config_24.h"
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "string_manip.h"
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_cpufreq.h"
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_alloc_counter.h"
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "oprof_start_util.h"
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "file_manip.h"
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_hw_config.h"
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddusing namespace std;
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic char const * green_xpm[] = {
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"16 16 2 1",
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd" 	c None",
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd".	c #00FF00",
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"    .......     ",
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"  ...........   ",
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd" .............  ",
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd" .............  ",
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"............... ",
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"............... ",
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"............... ",
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"............... ",
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"............... ",
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"............... ",
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"............... ",
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd" .............  ",
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd" .............  ",
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"  ...........   ",
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"    .......     ",
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"                " };
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic char const * red_xpm[] = {
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"16 16 2 1",
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd" 	c None",
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd".	c #FF0000",
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"    .......     ",
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"  ...........   ",
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd" .............  ",
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd" .............  ",
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"............... ",
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"............... ",
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"............... ",
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"............... ",
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"............... ",
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"............... ",
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"............... ",
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd" .............  ",
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd" .............  ",
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"  ...........   ",
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"    .......     ",
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd"                " };
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic QPixmap * green_pixmap;
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic QPixmap * red_pixmap;
958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddop_event_descr::op_event_descr()
988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	:
998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	counter_mask(0),
1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	val(0),
1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	unit(0),
1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	min_count(0)
1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddoprof_start::oprof_start()
1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	:
1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	oprof_start_base(0, 0, false, 0),
1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event_count_validator(new QIntValidator(event_count_edit)),
1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	current_event(0),
1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	cpu_speed(op_cpu_frequency()),
1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	total_nr_interrupts(0)
1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	green_pixmap = new QPixmap(green_xpm);
1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	red_pixmap = new QPixmap(red_xpm);
1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<string> args;
1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	args.push_back("--init");
1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (do_exec_command(OP_BINDIR "/opcontrol", args))
1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_FAILURE);
1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	cpu_type = op_get_cpu_type();
1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	op_nr_counters = op_get_nr_counters(cpu_type);
1258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (cpu_type == CPU_TIMER_INT) {
1278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		setup_config_tab->removePage(counter_setup_page);
1288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	} else {
1298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fill_events();
1308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
1318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	op_interface interface = op_get_interface();
1338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (interface == OP_INTERFACE_NO_GOOD) {
1348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		QMessageBox::warning(this, 0, "Couldn't determine kernel"
1358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		                     " interface version");
1368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit(EXIT_FAILURE);
1378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
1388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool is_26 = interface == OP_INTERFACE_26;
1398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (is_26) {
1418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		note_table_size_edit->hide();
1428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		note_table_size_label->hide();
1438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!op_file_readable("/dev/oprofile/backtrace_depth")) {
1448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			callgraph_depth_label->hide();
1458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			callgraph_depth_edit->hide();
1468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
1478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	} else {
1488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		callgraph_depth_label->hide();
1498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		callgraph_depth_edit->hide();
1508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		buffer_watershed_label->hide();
1518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		buffer_watershed_edit->hide();
1528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		cpu_buffer_size_label->hide();
1538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		cpu_buffer_size_edit->hide();
1548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
1558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// setup the configuration page.
1578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	kernel_filename_edit->setText(config.kernel_filename.c_str());
1588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	no_vmlinux->setChecked(config.no_kernel);
1608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	buffer_size_edit->setText(QString().setNum(config.buffer_size));
1628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	buffer_watershed_edit->setText(QString().setNum(config.buffer_watershed));
1638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	cpu_buffer_size_edit->setText(QString().setNum(config.cpu_buffer_size));
1648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	note_table_size_edit->setText(QString().setNum(config.note_table_size));
1658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	callgraph_depth_edit->setText(QString().setNum(config.callgraph_depth));
1668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	verbose->setChecked(config.verbose);
1678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	separate_lib_cb->setChecked(config.separate_lib);
1688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	separate_kernel_cb->setChecked(config.separate_kernel);
1698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	separate_cpu_cb->setChecked(config.separate_cpu);
1708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	separate_thread_cb->setChecked(config.separate_thread);
1718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// the unit mask check boxes
1738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	hide_masks();
1748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event_count_edit->setValidator(event_count_validator);
1768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	QIntValidator * iv;
1778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	iv = new QIntValidator(OP_MIN_BUF_SIZE, OP_MAX_BUF_SIZE, buffer_size_edit);
1788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	buffer_size_edit->setValidator(iv);
1798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	iv = new QIntValidator(OP_MIN_NOTE_TABLE_SIZE, OP_MAX_NOTE_TABLE_SIZE, note_table_size_edit);
1808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	note_table_size_edit->setValidator(iv);
1818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	iv = new QIntValidator(0, INT_MAX, callgraph_depth_edit);
1828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	callgraph_depth_edit->setValidator(iv);
1838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	iv = new QIntValidator(0, INT_MAX, buffer_watershed_edit);
1848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	buffer_watershed_edit->setValidator(iv);
1858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	iv = new QIntValidator(0, OP_MAX_CPU_BUF_SIZE, cpu_buffer_size_edit);
1868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	cpu_buffer_size_edit->setValidator(iv);
1878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// daemon status timer
1898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	startTimer(5000);
1908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	timerEvent(0);
1918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	resize(minimumSizeHint());
1938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// force the pixmap re-draw
1958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event_selected();
1968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::fill_events()
2008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
2018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// we need to build the event descr stuff before loading the
2028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// configuration because we use locate_event to get an event descr
2038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// from its name.
2048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	struct list_head * pos;
2058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	struct list_head * events = op_events(cpu_type);
2068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	list_for_each(pos, events) {
2088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		struct op_event * event = list_entry(pos, struct op_event, event_next);
2098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		op_event_descr descr;
2118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		descr.counter_mask = event->counter_mask;
2138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		descr.val = event->val;
2148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (event->unit->num) {
2158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			descr.unit = event->unit;
2168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		} else {
2178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			descr.unit = 0;
2188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
2198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		descr.name = event->name;
2218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		descr.help_str = event->desc;
2228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		descr.min_count = event->min_count;
2238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		for (uint ctr = 0; ctr < op_nr_counters; ++ctr) {
2258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			uint count;
2268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if (!(descr.counter_mask & (1 << ctr)))
2288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				continue;
2298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if (cpu_type == CPU_RTC) {
2318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				count = 1024;
2328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			} else {
2338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				/* setting to cpu Hz / 2000 gives a safe value for
2348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				 * all events, and a good one for most.
2358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				 */
2368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				if (cpu_speed)
2378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					count = int(cpu_speed * 500);
2388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				else
2398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					count = descr.min_count * 100;
2408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			}
2418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			event_cfgs[descr.name].count = count;
2438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			event_cfgs[descr.name].umask = 0;
2448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if (descr.unit)
2458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				event_cfgs[descr.name].umask = descr.unit->default_mask;
2468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			event_cfgs[descr.name].os_ring_count = 1;
2478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			event_cfgs[descr.name].user_ring_count = 1;
2488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
2498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		v_events.push_back(descr);
2518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
2528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	events_list->header()->hide();
2548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	events_list->setSorting(-1);
2558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fill_events_listbox();
2578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	read_set_events();
2598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// FIXME: why this ?
2618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (cpu_type == CPU_RTC)
2628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		events_list->setCurrentItem(events_list->firstChild());
2638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	load_config_file();
2658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
2668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddnamespace {
2698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// find the first item with the given text in column 0 or return NULL
2718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddQListViewItem * findItem(QListView * view, char const * name)
2728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
2738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// Qt 2.3.1 does not have QListView::findItem()
2748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	QListViewItem * item = view->firstChild();
2758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	while (item && strcmp(item->text(0).latin1(), name))
2778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		item = item->nextSibling();
2788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return item;
2808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
2818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
2838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::setup_default_event()
2868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
2878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	struct op_default_event_descr descr;
2888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	op_default_event(cpu_type, &descr);
2898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event_cfgs[descr.name].umask = descr.um;
2918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event_cfgs[descr.name].count = descr.count;
2928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event_cfgs[descr.name].user_ring_count = 1;
2938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event_cfgs[descr.name].os_ring_count = 1;
2948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	QListViewItem * item = findItem(events_list, descr.name);
2968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (item)
2978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		item->setSelected(true);
2988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
2998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::read_set_events()
3028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
3038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	string name = get_config_filename(".oprofile/daemonrc");
3048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ifstream in(name.c_str());
3068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!in) {
3088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		setup_default_event();
3098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return;
3108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
3118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	string str;
3138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool one_enabled = false;
3158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	while (getline(in, str)) {
3178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		string const val = split(str, '=');
3188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		string const name = str;
3198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!is_prefix(name, "CHOSEN_EVENTS_"))
3218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			continue;
3228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		one_enabled = true;
3248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// CHOSEN_EVENTS_#nr=CPU_CLK_UNHALTED:10000:0:1:1
3268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		vector<string> parts = separate_token(val, ':');
3278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (parts.size() != 5 && parts.size() != 2) {
3298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			cerr << "invalid configuration file\n";
3308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			// FIXME
3318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			exit(EXIT_FAILURE);
3328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
3338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		string ev_name = parts[0];
3358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_cfgs[ev_name].count =
3368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			op_lexical_cast<unsigned int>(parts[1]);
3378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// CPU_CLK_UNHALTED:10000 is also valid
3398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (parts.size() == 5) {
3408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			event_cfgs[ev_name].umask =
3418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				op_lexical_cast<unsigned int>(parts[2]);
3428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			event_cfgs[ev_name].user_ring_count =
3438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				op_lexical_cast<unsigned int>(parts[3]);
3448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			event_cfgs[ev_name].os_ring_count =
3458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				op_lexical_cast<unsigned int>(parts[4]);
3468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		} else {
3478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			event_cfgs[ev_name].umask = 0;
3488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			event_cfgs[ev_name].user_ring_count = 1;
3498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			event_cfgs[ev_name].os_ring_count = 1;
3508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
3518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		QListViewItem * item = findItem(events_list, ev_name.c_str());
3538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (item)
3548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			item->setSelected(true);
3558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
3568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// use default event if none set
3588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!one_enabled)
3598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		setup_default_event();
3608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
3618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::load_config_file()
3648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
3658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	string name = get_config_filename(".oprofile/daemonrc");
3668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ifstream in(name.c_str());
3688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!in) {
3698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!check_and_create_config_dir())
3708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return;
3718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		ofstream out(name.c_str());
3738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!out) {
3748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			QMessageBox::warning(this, 0, "Unable to open configuration "
3758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				"file ~/.oprofile/daemonrc");
3768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
3778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return;
3788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
3798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	in >> config;
3818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
3828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd// user request a "normal" exit so save the config file.
3858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::accept()
3868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
3878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// record the previous settings
3888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	record_selected_event_config();
3898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	save_config();
3918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	QDialog::accept();
3938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
3948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::closeEvent(QCloseEvent *)
3978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
3988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	accept();
3998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
4008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::timerEvent(QTimerEvent *)
4038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
4048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	static time_t last = time(0);
4058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	daemon_status dstat;
4078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	flush_profiler_data_btn->setEnabled(dstat.running);
4098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	stop_profiler_btn->setEnabled(dstat.running);
4108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	start_profiler_btn->setEnabled(!dstat.running);
4118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	reset_sample_files_btn->setEnabled(!dstat.running);
4128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!dstat.running) {
4148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		daemon_label->setText("Profiler is not running.");
4158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return;
4168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
4178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ostringstream ss;
4198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ss << "Profiler running:";
4208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	time_t curr = time(0);
4228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	total_nr_interrupts += dstat.nr_interrupts;
4238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (curr - last)
4258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		ss << " (" << dstat.nr_interrupts / (curr - last) << " interrupts / second, total " << total_nr_interrupts << ")";
4268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	daemon_label->setText(ss.str().c_str());
4288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	last = curr;
4308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
4318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::fill_events_listbox()
4348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
4358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	setUpdatesEnabled(false);
4368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (vector<op_event_descr>::reverse_iterator cit = v_events.rbegin();
4388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	     cit != v_events.rend(); ++cit) {
4398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		new QListViewItem(events_list, cit->name.c_str());
4408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
4418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	setUpdatesEnabled(true);
4438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	update();
4448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
4458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::display_event(op_event_descr const & descr)
4488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
4498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	setUpdatesEnabled(false);
4508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	setup_unit_masks(descr);
4528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	os_ring_count_cb->setEnabled(true);
4538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	user_ring_count_cb->setEnabled(true);
4548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event_count_edit->setEnabled(true);
4558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event_setting & cfg = event_cfgs[descr.name];
4578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	os_ring_count_cb->setChecked(cfg.os_ring_count);
4598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	user_ring_count_cb->setChecked(cfg.user_ring_count);
4608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	QString count_text;
4618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	count_text.setNum(cfg.count);
4628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event_count_edit->setText(count_text);
4638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event_count_validator->setRange(descr.min_count, max_perf_count());
4648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	setUpdatesEnabled(true);
4668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	update();
4678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
4688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddbool oprof_start::is_selectable_event(QListViewItem * item)
4718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
4728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (item->isSelected())
4738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return true;
4748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	selected_events.insert(item);
4768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool ret = false;
4788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (alloc_selected_events())
4798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		ret = true;
4808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	selected_events.erase(item);
4828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return ret;
4848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
4858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::draw_event_list()
4888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
4898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	QListViewItem * cur;
4908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (cur = events_list->firstChild(); cur; cur = cur->nextSibling()) {
4918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (is_selectable_event(cur))
4928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			cur->setPixmap(0, *green_pixmap);
4938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
4948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			cur->setPixmap(0, *red_pixmap);
4958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
4968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
4978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddbool oprof_start::alloc_selected_events() const
5008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
5018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<op_event const *> events;
5028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	set<QListViewItem *>::const_iterator it;
5048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (it = selected_events.begin(); it != selected_events.end(); ++it)
5058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		events.push_back(find_event_by_name((*it)->text(0).latin1(),0,0));
5068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	size_t * map =
5088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		map_event_to_counter(&events[0], events.size(), cpu_type);
5098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!map)
5118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return false;
5128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	free(map);
5148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return true;
5158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
5168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::event_selected()
5188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
5198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// The deal is simple: QT lack of a way to know what item was the last
5208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// (de)selected item so we record a set of selected items and diff
5218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// it in the appropriate way with the previous list of selected items.
5228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	set<QListViewItem *> current_selection;
5248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	QListViewItem * cur;
5258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (cur = events_list->firstChild(); cur; cur = cur->nextSibling()) {
5268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (cur->isSelected())
5278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			current_selection.insert(cur);
5288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
5298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// First remove the deselected item.
5318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<QListViewItem *> new_deselected;
5328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	set_difference(selected_events.begin(), selected_events.end(),
5338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		       current_selection.begin(), current_selection.end(),
5348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		       back_inserter(new_deselected));
5358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<QListViewItem *>::const_iterator it;
5368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (it = new_deselected.begin(); it != new_deselected.end(); ++it)
5378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		selected_events.erase(*it);
5388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// Now try to add the newly selected item if enough HW resource exists
5408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<QListViewItem *> new_selected;
5418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	set_difference(current_selection.begin(), current_selection.end(),
5428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		       selected_events.begin(), selected_events.end(),
5438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		       back_inserter(new_selected));
5448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (it = new_selected.begin(); it != new_selected.end(); ++it) {
5458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		selected_events.insert(*it);
5468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!alloc_selected_events()) {
5478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			(*it)->setSelected(false);
5488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			selected_events.erase(*it);
5498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		} else {
5508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			current_event = *it;
5518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
5528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
5538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	draw_event_list();
5558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (current_event)
5578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		display_event(locate_event(current_event->text(0).latin1()));
5588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
5598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::event_over(QListViewItem * item)
5628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
5638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	op_event_descr const & descr = locate_event(item->text(0).latin1());
5648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	string help_str = descr.help_str.c_str();
5668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!is_selectable_event(item)) {
5678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		help_str += " conflicts with:";
5688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		set<QListViewItem *>::const_iterator it;
5708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		for (it = selected_events.begin();
5718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		     it != selected_events.end(); ) {
5728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			QListViewItem * temp = *it;
5738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			selected_events.erase(it++);
5748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if (is_selectable_event(item)) {
5758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				help_str += " ";
5768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				help_str += temp->text(0).latin1();
5778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			}
5788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			selected_events.insert(temp);
5798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
5808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
5818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event_help_label->setText(help_str.c_str());
5838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
5848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// select the kernel image filename
5878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::choose_kernel_filename()
5888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
5898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	string name = kernel_filename_edit->text().latin1();
5908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	string result = do_open_file_or_dir(name, false);
5918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!result.empty())
5938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		kernel_filename_edit->setText(result.c_str());
5948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
5958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd// this record the current selected event setting in the event_cfg[] stuff.
5988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd// FIXME: need validation?
5998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::record_selected_event_config()
6008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
6018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!current_event)
6028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return;
6038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	string name(current_event->text(0).latin1());
6058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event_setting & cfg = event_cfgs[name];
6078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	op_event_descr const & curr = locate_event(name);
6088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	cfg.count = event_count_edit->text().toUInt();
6108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	cfg.os_ring_count = os_ring_count_cb->isChecked();
6118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	cfg.user_ring_count = user_ring_count_cb->isChecked();
6128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	cfg.umask = get_unit_mask(curr);
6138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
6148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd// validate and save the configuration (The qt validator installed
6178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd// are not sufficient to do the validation)
6188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddbool oprof_start::record_config()
6198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
6208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	config.kernel_filename = kernel_filename_edit->text().latin1();
6218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	config.no_kernel = no_vmlinux->isChecked();
6228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	uint temp = buffer_size_edit->text().toUInt();
6248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (temp < OP_MIN_BUF_SIZE || temp > OP_MAX_BUF_SIZE) {
6258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		ostringstream error;
6268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		error << "buffer size out of range: " << temp
6288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		      << " valid range is [" << OP_MIN_BUF_SIZE << ", "
6298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		      << OP_MAX_BUF_SIZE << "]";
6308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		QMessageBox::warning(this, 0, error.str().c_str());
6328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return false;
6348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
6358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	config.buffer_size = temp;
6368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	temp = buffer_watershed_edit->text().toUInt();
6388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// watershed above half of buffer size make little sense.
6398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (temp > config.buffer_size / 2) {
6408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		ostringstream error;
6418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		error << "buffer watershed out of range: " << temp
6438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		      << " valid range is [0 (use default), buffer size/2] "
6448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		      << "generally 0.25 * buffer size is fine";
6458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		QMessageBox::warning(this, 0, error.str().c_str());
6478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return false;
6498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
6508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	config.buffer_watershed = temp;
6518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	temp = cpu_buffer_size_edit->text().toUInt();
6538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if ((temp != 0 && temp < OP_MIN_CPU_BUF_SIZE) ||
6548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    temp > OP_MAX_CPU_BUF_SIZE) {
6558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		ostringstream error;
6568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		error << "cpu buffer size out of range: " << temp
6588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		      << " valid range is [" << OP_MIN_CPU_BUF_SIZE << ", "
6598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		      << OP_MAX_CPU_BUF_SIZE << "] (size = 0: use default)";
6608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		QMessageBox::warning(this, 0, error.str().c_str());
6628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return false;
6648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
6658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	config.cpu_buffer_size = temp;
6668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	temp = note_table_size_edit->text().toUInt();
6688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (temp < OP_MIN_NOTE_TABLE_SIZE || temp > OP_MAX_NOTE_TABLE_SIZE) {
6698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		ostringstream error;
6708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		error << "note table size out of range: " << temp
6728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		      << " valid range is [" << OP_MIN_NOTE_TABLE_SIZE << ", "
6738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		      << OP_MAX_NOTE_TABLE_SIZE << "]";
6748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		QMessageBox::warning(this, 0, error.str().c_str());
6768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return false;
6788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
6798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	config.note_table_size = temp;
6808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	temp = callgraph_depth_edit->text().toUInt();
6828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (temp > INT_MAX) {
6838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		ostringstream error;
6848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		error << "callgraph depth  out of range: " << temp
6868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		      << " valid range is [" << 0 << ", "
6878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		      << INT_MAX << "]";
6888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		QMessageBox::warning(this, 0, error.str().c_str());
6908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return false;
6928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
6938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	config.callgraph_depth = temp;
6948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	config.verbose = verbose->isChecked();
6968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	config.separate_lib = separate_lib_cb->isChecked();
6978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	config.separate_kernel = separate_kernel_cb->isChecked();
6988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	config.separate_cpu = separate_cpu_cb->isChecked();
6998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	config.separate_thread = separate_thread_cb->isChecked();
7008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return true;
7028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
7038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::get_unit_mask_part(op_event_descr const & descr, uint num,
7068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd                                     bool selected, uint & mask)
7078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
7088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!selected)
7098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return;
7108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if  (num >= descr.unit->num)
7118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return;
7128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (descr.unit->unit_type_mask == utm_bitmask)
7148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		mask |= descr.unit->um[num].value;
7158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
7168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		mask = descr.unit->um[num].value;
7178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
7188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd// return the unit mask selected through the unit mask check box
7218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodduint oprof_start::get_unit_mask(op_event_descr const & descr)
7228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
7238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	uint mask = 0;
7248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!descr.unit)
7268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return 0;
7278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// mandatory mask is transparent for user.
7298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (descr.unit->unit_type_mask == utm_mandatory) {
7308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		mask = descr.unit->default_mask;
7318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return mask;
7328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
7338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	get_unit_mask_part(descr, 0, check0->isChecked(), mask);
7358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	get_unit_mask_part(descr, 1, check1->isChecked(), mask);
7368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	get_unit_mask_part(descr, 2, check2->isChecked(), mask);
7378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	get_unit_mask_part(descr, 3, check3->isChecked(), mask);
7388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	get_unit_mask_part(descr, 4, check4->isChecked(), mask);
7398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	get_unit_mask_part(descr, 5, check5->isChecked(), mask);
7408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	get_unit_mask_part(descr, 6, check6->isChecked(), mask);
7418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	get_unit_mask_part(descr, 7, check7->isChecked(), mask);
7428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	get_unit_mask_part(descr, 8, check8->isChecked(), mask);
7438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	get_unit_mask_part(descr, 9, check9->isChecked(), mask);
7448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	get_unit_mask_part(descr, 10, check10->isChecked(), mask);
7458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	get_unit_mask_part(descr, 11, check11->isChecked(), mask);
7468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	get_unit_mask_part(descr, 12, check12->isChecked(), mask);
7478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	get_unit_mask_part(descr, 13, check13->isChecked(), mask);
7488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	get_unit_mask_part(descr, 14, check14->isChecked(), mask);
7498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	get_unit_mask_part(descr, 15, check15->isChecked(), mask);
7508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return mask;
7518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
7528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::hide_masks()
7558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
7568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	check0->hide();
7578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	check1->hide();
7588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	check2->hide();
7598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	check3->hide();
7608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	check4->hide();
7618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	check5->hide();
7628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	check6->hide();
7638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	check7->hide();
7648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	check8->hide();
7658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	check9->hide();
7668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	check10->hide();
7678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	check11->hide();
7688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	check12->hide();
7698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	check13->hide();
7708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	check14->hide();
7718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	check15->hide();
7728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
7738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::setup_unit_masks(op_event_descr const & descr)
7768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
7778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	op_unit_mask const * um = descr.unit;
7788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	hide_masks();
7808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!um || um->unit_type_mask == utm_mandatory)
7828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return;
7838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event_setting & cfg = event_cfgs[descr.name];
7858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	unit_mask_group->setExclusive(um->unit_type_mask == utm_exclusive);
7878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (size_t i = 0; i < um->num ; ++i) {
7898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		QCheckBox * check = 0;
7908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		switch (i) {
7918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			case 0: check = check0; break;
7928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			case 1: check = check1; break;
7938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			case 2: check = check2; break;
7948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			case 3: check = check3; break;
7958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			case 4: check = check4; break;
7968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			case 5: check = check5; break;
7978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			case 6: check = check6; break;
7988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			case 7: check = check7; break;
7998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			case 8: check = check8; break;
8008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			case 9: check = check9; break;
8018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			case 10: check = check10; break;
8028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			case 11: check = check11; break;
8038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			case 12: check = check12; break;
8048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			case 13: check = check13; break;
8058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			case 14: check = check14; break;
8068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			case 15: check = check15; break;
8078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
8088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		check->setText(um->um[i].desc);
8098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (um->unit_type_mask == utm_exclusive)
8108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			check->setChecked(cfg.umask == um->um[i].value);
8118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
8128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			check->setChecked(cfg.umask & um->um[i].value);
8138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		check->show();
8158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
8168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	unit_mask_group->setMinimumSize(unit_mask_group->sizeHint());
8178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	setup_config_tab->setMinimumSize(setup_config_tab->sizeHint());
8188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
8198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodduint oprof_start::max_perf_count() const
8228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
8238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return cpu_type == CPU_RTC ? OP_MAX_RTC_COUNT : OP_MAX_PERF_COUNT;
8248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
8258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::on_flush_profiler_data()
8288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
8298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<string> args;
8308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	args.push_back("--dump");
8318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (daemon_status().running)
8338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		do_exec_command(OP_BINDIR "/opcontrol", args);
8348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
8358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		QMessageBox::warning(this, 0, "The profiler is not started.");
8368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
8378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd// user is happy of its setting.
8408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::on_start_profiler()
8418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
8428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// save the current settings
8438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	record_selected_event_config();
8448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool one_enable = false;
8468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	QListViewItem * cur;
8488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (cur = events_list->firstChild(); cur; cur = cur->nextSibling()) {
8498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!cur->isSelected())
8508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			continue;
8518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// the missing reference is intended: gcc 2.91.66 can compile
8538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// "op_event_descr const & descr = ..." w/o a warning
8548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		op_event_descr const descr =
8558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			locate_event(cur->text(0).latin1());
8568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_setting & cfg = event_cfgs[cur->text(0).latin1()];
8588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		one_enable = true;
8608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!cfg.os_ring_count && !cfg.user_ring_count) {
8628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			QMessageBox::warning(this, 0, "You must select to "
8638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					 "profile at least one of user binaries/kernel");
8648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return;
8658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
8668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (cfg.count < descr.min_count ||
8688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		    cfg.count > max_perf_count()) {
8698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			ostringstream out;
8708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			out << "event " << descr.name << " count of range: "
8728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			    << cfg.count << " must be in [ "
8738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			    << descr.min_count << ", "
8748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			    << max_perf_count()
8758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			    << "]";
8768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			QMessageBox::warning(this, 0, out.str().c_str());
8788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return;
8798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
8808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (descr.unit &&
8828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		    descr.unit->unit_type_mask == utm_bitmask &&
8838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		    cfg.umask == 0) {
8848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			ostringstream out;
8858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			out << "event " << descr.name << " invalid unit mask: "
8878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			    << cfg.umask << endl;
8888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			QMessageBox::warning(this, 0, out.str().c_str());
8908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return;
8918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
8928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
8938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (one_enable == false && cpu_type != CPU_TIMER_INT) {
8958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		QMessageBox::warning(this, 0, "No counters enabled.\n");
8968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return;
8978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
8988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (daemon_status().running) {
9008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// gcc 2.91 work around
9018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		int user_choice = 0;
9028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		user_choice =
9038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			QMessageBox::warning(this, 0,
9048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					     "Profiler already started:\n\n"
9058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					     "stop and restart it?",
9068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					     "&Restart", "&Cancel", 0, 0, 1);
9078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (user_choice == 1)
9098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return;
9108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// this flush profiler data also.
9128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		on_stop_profiler();
9138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
9148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<string> args;
9168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// save_config validate and setup the config
9188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (save_config()) {
9198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// now actually start
9208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		args.push_back("--start");
9218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (config.verbose)
9228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			args.push_back("--verbose");
9238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		do_exec_command(OP_BINDIR "/opcontrol", args);
9248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
9258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	total_nr_interrupts = 0;
9278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	timerEvent(0);
9288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
9298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddbool oprof_start::save_config()
9328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
9338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!record_config())
9348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return false;
9358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<string> args;
9378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// saving config is done by running opcontrol --setup with appropriate
9398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// setted parameters so we use the same config file as command line
9408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// tools
9418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	args.push_back("--setup");
9438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool one_enabled = false;
9458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<string> tmpargs;
9478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	tmpargs.push_back("--setup");
9488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	QListViewItem * cur;
9508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (cur = events_list->firstChild(); cur; cur = cur->nextSibling()) {
9518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!cur->isSelected())
9528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			continue;
9538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_setting & cfg = event_cfgs[cur->text(0).latin1()];
9558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		op_event_descr const & descr =
9578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			locate_event(cur->text(0).latin1());
9588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		one_enabled = true;
9608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		string arg = "--event=" + descr.name;
9628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		arg += ":" + op_lexical_cast<string>(cfg.count);
9638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		arg += ":" + op_lexical_cast<string>(cfg.umask);
9648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		arg += ":" + op_lexical_cast<string>(cfg.os_ring_count);
9658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		arg += ":" + op_lexical_cast<string>(cfg.user_ring_count);
9668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		tmpargs.push_back(arg);
9688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
9698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// only set counters if at least one is enabled
9718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (one_enabled)
9728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		args = tmpargs;
9738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (config.no_kernel) {
9758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		args.push_back("--no-vmlinux");
9768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	} else {
9778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		args.push_back("--vmlinux=" + config.kernel_filename);
9788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
9798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	args.push_back("--buffer-size=" +
9818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	       op_lexical_cast<string>(config.buffer_size));
9828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (op_get_interface() == OP_INTERFACE_24) {
9848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		args.push_back("--note-table-size=" +
9858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		       op_lexical_cast<string>(config.note_table_size));
9868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	} else {
9878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		args.push_back("--buffer-watershed=" +
9888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		       op_lexical_cast<string>(config.buffer_watershed));
9898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		args.push_back("--cpu-buffer-size=" +
9908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		       op_lexical_cast<string>(config.cpu_buffer_size));
9918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (op_file_readable("/dev/oprofile/backtrace_depth")) {
9928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			args.push_back("--callgraph=" +
9938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		              op_lexical_cast<string>(config.callgraph_depth));
9948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
9958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
9968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	string sep = "--separate=";
9988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (config.separate_lib)
10008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		sep += "library,";
10018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (config.separate_kernel)
10028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		sep += "kernel,";
10038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (config.separate_cpu)
10048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		sep += "cpu,";
10058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (config.separate_thread)
10068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		sep += "thread,";
10078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (sep == "--separate=")
10098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		sep += "none";
10108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	args.push_back(sep);
10118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// 2.95 work-around, it didn't like return !do_exec_command()
10138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool ret = !do_exec_command(OP_BINDIR "/opcontrol", args);
10148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return ret;
10158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
10168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd// flush and stop the profiler if it was started.
10198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::on_stop_profiler()
10208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
10218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vector<string> args;
10228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	args.push_back("--shutdown");
10238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (daemon_status().running)
10258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		do_exec_command(OP_BINDIR "/opcontrol", args);
10268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
10278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		QMessageBox::warning(this, 0, "The profiler is already stopped.");
10288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	timerEvent(0);
10308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
10318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::on_separate_kernel_cb_changed(int state)
10348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
10358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (state == 2)
10368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		separate_lib_cb->setChecked(true);
10378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
10388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_start::on_reset_sample_files()
10408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
10418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	int ret = QMessageBox::warning(this, 0, "Are you sure you want to "
10428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	       "reset your last profile session ?", "Yes", "No", 0, 0, 1);
10438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!ret) {
10448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		vector<string> args;
10458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		args.push_back("--reset");
10468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!do_exec_command(OP_BINDIR "/opcontrol", args))
10478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			// the next timer event will overwrite the message
10488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			daemon_label->setText("Last profile session reseted.");
10498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
10508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			QMessageBox::warning(this, 0,
10518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			     "Can't reset profiling session.");
10528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
10538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
10548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// function object for matching against name
10578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass event_name_eq {
10588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	string name_;
10598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpublic:
10608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	explicit event_name_eq(string const & s) : name_(s) {}
10618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool operator()(op_event_descr const & d) const {
10628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return d.name == name_;
10638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
10648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
10658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd// helper to retrieve an event descr through its name.
10688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddop_event_descr const & oprof_start::locate_event(string const & name) const
10698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
10708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return *(find_if(v_events.begin(), v_events.end(), event_name_eq(name)));
10718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1072