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