/**
* @file oprof_start.h
* The GUI start main class
*
* @remark Copyright 2002 OProfile authors
* @remark Read the file COPYING
*
* @author Philippe Elie
* @author John Levon
*/
#ifndef OPROF_START_H
#define OPROF_START_H
#include <vector>
#include <map>
#include <set>
#include "ui/oprof_start.base.h"
#include "oprof_start_config.h"
#include "op_events.h"
class QIntValidator;
class QListViewItem;
class QTimerEvent;
/// a struct describing a particular event type
struct op_event_descr {
op_event_descr();
/// bit mask of allowed counters
uint counter_mask;
/// hardware event number
u32 val;
/// unit mask values if applicable
op_unit_mask const * unit;
/// name of event
std::string name;
/// description of event
std::string help_str;
/// minimum counter value
uint min_count;
};
class oprof_start : public oprof_start_base
{
Q_OBJECT
public:
oprof_start();
protected slots:
/// select the kernel image filename
void choose_kernel_filename();
/// flush profiler
void on_flush_profiler_data();
/// start profiler
void on_start_profiler();
/// stop profiler
void on_stop_profiler();
/// events selection change
void event_selected();
/// the mouse is over an event
void event_over(QListViewItem *);
/// state of separate_kernel_cb changed
void on_separate_kernel_cb_changed(int);
/// reset sample files
void on_reset_sample_files();
/// close the dialog
void accept();
/// WM hide event
void closeEvent(QCloseEvent * e);
/// timer event
void timerEvent(QTimerEvent * e);
private:
/// the counter combo has been activated
void fill_events_listbox();
/// fill the event details and gui setup
void fill_events();
/// find an event description by name
op_event_descr const & locate_event(std::string const & name) const;
/// update config on user change
void record_selected_event_config();
/// update config and validate
bool record_config();
/// calculate unit mask for given event and unit mask part
void get_unit_mask_part(op_event_descr const & descr, uint num, bool selected, uint & mask);
/// calculate unit mask for given event
uint get_unit_mask(op_event_descr const & descr);
/// set the unit mask widgets for given event
void setup_unit_masks(op_event_descr const & descr);
/// return the maximum perf counter value for the current cpu type
uint max_perf_count() const;
/// show an event's settings
void display_event(op_event_descr const & descrp);
/// hide unit mask widgets
void hide_masks(void);
/// read the events set in daemonrc
void read_set_events();
/// use the default event
void setup_default_event();
/// load the extra config file
void load_config_file();
/// save the config
bool save_config();
/// redraw the event list by changing icon status
void draw_event_list();
/// return true if item is selectable or already selected
bool is_selectable_event(QListViewItem * item);
/// try to alloc counters for the selected_events
bool alloc_selected_events() const;
/// validator for event count
QIntValidator* event_count_validator;
/// all available events for this hardware
std::vector<op_event_descr> v_events;
/// current event configs for each counter
typedef std::map<std::string, event_setting> event_setting_map;
event_setting_map event_cfgs;
/// The currently selected events. We must track this because
/// with multiple selection listbox QT doesn't allow to know
/// what is the last selected item. events_selected() update it
std::set<QListViewItem *> selected_events;
QListViewItem * current_event;
/// current config
config_setting config;
/// the expansion of "~" directory
std::string user_dir;
/// CPU type
op_cpu cpu_type;
/// CPU speed in MHz
double cpu_speed;
/// total number of available HW counters
uint op_nr_counters;
/// Total number of samples for this run
unsigned long total_nr_interrupts;
};
#endif // OPROF_START_H