#include <glib.h>
#include <gtk/gtk.h>
#include <gdk/gdk.h>
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-
#include <ltt/ltt.h>
#include <ltt/event.h>
#include <ltt/type.h>
#define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format)
#define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format)
+#define TRACE_NUMBER 0
#define NO_ITEMS 0
enum{
NUM_WR_COLUMN,
N_COLUMNS
};
+
enum operation_t {
LTTV_READ_OPERATION = 1,
LTTV_WRITE_OPERATION
typedef struct _DiskPerformanceData {
Tab * tab;
- LttvHooks * event_hooks;
+
LttvHooks * hooks_trace_after;
+
LttvHooks * hooks_trace_before;
- TimeWindow time_window; // time window
+ /* time window */
+ TimeWindow time_window;
GtkWidget * scroll_win;
+
/* Model containing list data */
GtkListStore *store_m;
+
GtkWidget *hbox_v;
+
/* Widget to display the data in a columned list */
GtkWidget *tree_v;
+
/* Selection handler */
GtkTreeSelection *select_c;
GArray *disk_array;
+ LttvHooksById * event_by_id_hooks;
+
} DiskPerformanceData;
GSList *g_disk_data_list = NULL ;
-DiskPerformanceData *disk_performance_data(Tab *tab);
+
+
+/* facility */
+GQuark LTT_FACILITY_BLOCK;
+
+/* events */
+GQuark LTT_EVENT_BLOCK_READ;
+GQuark LTT_EVENT_BLOCK_WRITE;
+
+static DiskPerformanceData *disk_performance_data(Tab *tab);
static void disk_destroy_walk(gpointer data, gpointer user_data);
-static gboolean parse_event(void *hook_data, void *call_data);
static gboolean disk_show(void *hook_data, void *call_data);
static gboolean trace_header(void *hook_data, void *call_data);
static gboolean disk_update_time_window(void * hook_data, void * call_data);
-static void tree_v_size_allocate_cb (GtkWidget *widget, GtkAllocation *alloc, gpointer data);
-static void tree_v_size_request_cb (GtkWidget *widget, GtkRequisition *requisition, gpointer data);
-static void tree_v_cursor_changed_cb (GtkWidget *widget, gpointer data);
-static void tree_v_move_cursor_cb (GtkWidget *widget, GtkMovementStep arg1, gint arg2, gpointer data);
-static void tree_selection_changed_cb (GtkTreeSelection *selection, gpointer data);
static void request_event( DiskPerformanceData *disk_performance);
void gui_disperformance_free(DiskPerformanceData *event_viewer_data);
-static void get_event_detail(LttEvent *e, LttField *f, GString * s, lttv_block* disk_data);
+static void get_event_detail(LttEvent *e, lttv_block* disk_data);
static char * major_minor_to_diskname( lttv_block* disk_data);
static void sum_data(char* diskname, guint size, enum operation_t opt, GArray *disk_array);
+static GtkWidget *disk_performance(Tab * tab);
+
+static gboolean block_read_callback(void *hook_data, void *call_data);
+
+static gboolean block_write_callback(void *hook_data, void *call_data);
+
+
+static gboolean disk_show(void *hook_data, void *call_data){
+
+ guint i;
+ lttv_total_block element;
+ GtkTreeIter iter;
+ LttTime time_interval;
+ guint64 time_interval_64;
+ guint64 temp_variable;
+ guint64 bytes_read_per_sec, bytes_written_per_sec;
+ g_info(" diskperformance: disk_show() \n");
+ DiskPerformanceData *disk_performance = (DiskPerformanceData *)hook_data;
+ GArray *disk_array = disk_performance->disk_array;
+ time_interval = ltt_time_sub(disk_performance->time_window.end_time, disk_performance->time_window.start_time);
+
+ time_interval_64 = time_interval.tv_sec;
+ time_interval_64 *= NANOSECONDS_PER_SECOND;
+ time_interval_64 += time_interval.tv_nsec;
+ gtk_list_store_clear(disk_performance->store_m);
+ for(i = 0; i < disk_array->len; i++){
+
+ element = g_array_index(disk_array,lttv_total_block,i);
+ temp_variable = element.total_bytes_read * NANOSECONDS_PER_SECOND;
+ bytes_read_per_sec = (guint64) temp_variable / time_interval_64;
+
+ temp_variable = element.total_bytes_written * NANOSECONDS_PER_SECOND;
+ bytes_written_per_sec = (guint64) temp_variable / time_interval_64;
+
+ gtk_list_store_append (disk_performance->store_m, &iter);
+ gtk_list_store_set (disk_performance->store_m, &iter,
+ DISKNAME_COLUMN, element.diskname,
+ BYTES_RD_COLUMN, element.total_bytes_read,
+ BYTES_RD_SEC_COLUMN,bytes_read_per_sec,
+ NUM_RD_COLUMN, element.num_read_operations,
+ BYTES_WR_COLUMN, element.total_bytes_written,
+ BYTES_WR_SEC_COLUMN, bytes_written_per_sec,
+ NUM_WR_COLUMN, element.num_write_operations,
+ -1);
+
+ }
+ if(disk_performance->disk_array->len)
+ g_array_remove_range (disk_performance->disk_array,0,disk_performance->disk_array->len);
+ return FALSE;
+}
+
+static gboolean trace_header(void *hook_data, void *call_data){
+ return FALSE;
+}
+
+
+static gboolean disk_update_time_window(void * hook_data, void * call_data){
+
+ DiskPerformanceData *disk_performance = (DiskPerformanceData *) hook_data;
+ const TimeWindowNotifyData *time_window_nofify_data = ((const TimeWindowNotifyData *)call_data);
+ disk_performance->time_window = *time_window_nofify_data->new_time_window;
+ Tab *tab = disk_performance->tab;
+ lttvwindow_events_request_remove_all(tab, disk_performance);
+ request_event( disk_performance);
+
+
+ return FALSE;
+}
+
+void gui_disperformance_free(DiskPerformanceData *eventdata){
+ Tab *tab = eventdata->tab;
+ g_info("disperformance.c : gui_disperformance_free, %p", eventdata);
+ g_info("%p, %p", eventdata, tab);
+ if(tab != NULL)
+ {
+ g_array_free (eventdata->disk_array, TRUE);
+
+ lttvwindow_unregister_time_window_notify(tab,
+ disk_update_time_window,
+ eventdata);
+
+ lttvwindow_events_request_remove_all(eventdata->tab,
+ eventdata);
+ g_disk_data_list = g_slist_remove(g_disk_data_list, eventdata);
+ }
+ g_free(eventdata);
+ g_info("disperformance.c : gui_disperformance_free end, %p", eventdata);
+}
+
+
+
+
+
+
+void disk_destructor_full(DiskPerformanceData *disk_data)
+{
+
+ if(GTK_IS_WIDGET(disk_data->hbox_v))
+ gtk_widget_destroy(disk_data->hbox_v);
+
+}
+
+static void disk_destroy_walk(gpointer data, gpointer user_data)
+{
+ g_info("Walk destroy GUI disk performance Viewer");
+ disk_destructor_full((DiskPerformanceData*)data);
+}
+/**
+ * init function
+ *
+ *
+ * This is the entry point of the viewer.
+ *
+ */
+static void init()
+{
+
+ g_info("Init diskPerformance.c");
+
+ LTT_FACILITY_BLOCK = g_quark_from_string("block");
+ LTT_EVENT_BLOCK_READ = g_quark_from_string("read");
+ LTT_EVENT_BLOCK_WRITE = g_quark_from_string("write");
+
+ lttvwindow_register_constructor("diskperformance",
+ "/",
+ "Insert Disk Performance",
+ hDiskPerformanceInsert_xpm,
+ "Insert Disk Performance",
+ disk_performance);
+}
-GtkWidget *disk_performance(Tab * tab){
+/**
+ * Constructor hook
+ *
+ */
+GtkWidget *disk_performance(Tab * tab)
+{
DiskPerformanceData* disk_data = disk_performance_data(tab);
if(disk_data)
return disk_data->hbox_v;
else
return NULL;
-
}
-DiskPerformanceData *disk_performance_data(Tab *tab){
-
+/**
+ * This function initializes the Event Viewer functionnality through the
+ * GTK API.
+ */
+DiskPerformanceData *disk_performance_data(Tab *tab)
+{
LttTime end;
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
gtk_widget_show (disk_data->scroll_win);
gtk_scrolled_window_set_policy(
GTK_SCROLLED_WINDOW(disk_data->scroll_win),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC/*GTK_POLICY_NEVER*/);
-
-
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
/* Create a model for storing the data list */
disk_data->store_m = gtk_list_store_new (
N_COLUMNS, /* Total number of columns */
- G_TYPE_STRING, /* Diskname */ // to change from INT to string later
+ G_TYPE_STRING, /* Diskname */
G_TYPE_INT64, /* Bytes read */
- G_TYPE_INT64, /* Bytes read/sec */
+ G_TYPE_INT64, /* Bytes read/sec */
G_TYPE_INT,
- G_TYPE_INT64, /* bytes written */
- G_TYPE_INT64, /* bytes written/sec */
+ G_TYPE_INT64, /* bytes written */
+ G_TYPE_INT64, /* bytes written/sec */
G_TYPE_INT
);
disk_data->tree_v = gtk_tree_view_new_with_model (GTK_TREE_MODEL (disk_data->store_m));
-
- g_signal_connect (G_OBJECT (disk_data->tree_v), "size-allocate",
- G_CALLBACK (tree_v_size_allocate_cb),
- disk_data);
- g_signal_connect (G_OBJECT (disk_data->tree_v), "size-request",
- G_CALLBACK (tree_v_size_request_cb),
- disk_data);
- g_signal_connect (G_OBJECT (disk_data->tree_v), "cursor-changed",
- G_CALLBACK (tree_v_cursor_changed_cb),
- disk_data);
- g_signal_connect (G_OBJECT (disk_data->tree_v), "move-cursor",
- G_CALLBACK (tree_v_move_cursor_cb),
- disk_data);
-
+
g_object_unref (G_OBJECT (disk_data->store_m));
renderer = gtk_cell_renderer_text_new ();
+
column = gtk_tree_view_column_new_with_attributes ("DiskName",
renderer,
"text", DISKNAME_COLUMN,
disk_data->select_c = gtk_tree_view_get_selection (GTK_TREE_VIEW (disk_data->tree_v));
gtk_tree_selection_set_mode (disk_data->select_c, GTK_SELECTION_SINGLE);
- g_signal_connect (G_OBJECT (disk_data->select_c), "changed",
- G_CALLBACK (tree_selection_changed_cb),
- disk_data);
-
+
gtk_container_add (GTK_CONTAINER (disk_data->scroll_win), disk_data->tree_v);
disk_data->hbox_v = gtk_hbox_new(0, 0);
request_event(disk_data);
return disk_data;
}
-
-static gboolean disk_show(void *hook_data, void *call_data){
+/**
+ *
+ * For each trace in the traceset, this function:
+ * - calls lttv_trace_find_hook() & registers a hook function to event_by_id_hooks
+ * - registers a callback function to each hook
+ * - calls lttvwindow_events_request() to request data in a specific
+ * time interval to the main window
+ *
+ */
+static void request_event(DiskPerformanceData *disk_performance)
+{
+ guint i, k, l, nb_trace;
- guint i;
- lttv_total_block element;
- GtkTreeIter iter;
- LttTime time_interval;
- guint64 time_interval_64;
- guint64 temp_variable;
- guint64 bytes_read_per_sec, bytes_written_per_sec;
- g_info(" diskperformance: disk_show() \n");
- DiskPerformanceData *disk_performance = (DiskPerformanceData *)hook_data;
- GArray *disk_array = disk_performance->disk_array;
- time_interval = ltt_time_sub(disk_performance->time_window.end_time, disk_performance->time_window.start_time);
+ GArray *hooks;
- time_interval_64 = time_interval.tv_sec;
- time_interval_64 *= NANOSECONDS_PER_SECOND;
- time_interval_64 += time_interval.tv_nsec;
- gtk_list_store_clear(disk_performance->store_m);
- for(i = 0; i < disk_array->len; i++){
-
- element = g_array_index(disk_array,lttv_total_block,i);
- temp_variable = element.total_bytes_read * NANOSECONDS_PER_SECOND;
- bytes_read_per_sec = (guint64) temp_variable / time_interval_64;
+ guint ret;
+
+ LttvTraceHook *hook;
+
+ LttvTraceState *ts;
- temp_variable = element.total_bytes_written * NANOSECONDS_PER_SECOND;
- bytes_written_per_sec = (guint64) temp_variable / time_interval_64;
+ LttvTraceHookByFacility *thf;
+
+ LttvTracesetContext *tsc = lttvwindow_get_traceset_context(disk_performance->tab);
+ /* Get the traceset */
+ LttvTraceset *traceset = tsc->ts;
+
+ nb_trace = lttv_traceset_number(traceset);
- gtk_list_store_append (disk_performance->store_m, &iter);
- gtk_list_store_set (disk_performance->store_m, &iter,
- DISKNAME_COLUMN, element.diskname,
- BYTES_RD_COLUMN, element.total_bytes_read,
- BYTES_RD_SEC_COLUMN,bytes_read_per_sec,
- NUM_RD_COLUMN, element.num_read_operations,
- BYTES_WR_COLUMN, element.total_bytes_written,
- BYTES_WR_SEC_COLUMN, bytes_written_per_sec,
- NUM_WR_COLUMN, element.num_write_operations,
- -1);
-
+ for(i = 0; i<MIN(TRACE_NUMBER+1, nb_trace);i++)
+ {
+ EventsRequest *events_request = g_new(EventsRequest, 1);
+
+ hooks = g_array_new(FALSE, FALSE, sizeof(LttvTraceHook));
+
+ hooks = g_array_set_size(hooks, 2);
+
+ /* Get a trace state */
+ ts = (LttvTraceState *)tsc->traces[i];
+
+ disk_performance->event_by_id_hooks = lttv_hooks_by_id_new();
+ /* Register event_by_id_hooks with a callback function */
+ ret = lttv_trace_find_hook(ts->parent.t,
+ LTT_FACILITY_BLOCK, LTT_EVENT_BLOCK_READ,
+ 0, 0, 0,
+ block_read_callback,
+ disk_performance,
+ &g_array_index(hooks, LttvTraceHook, 0));
+
+ ret = lttv_trace_find_hook(ts->parent.t,
+ LTT_FACILITY_BLOCK, LTT_EVENT_BLOCK_WRITE,
+ 0, 0, 0,
+ block_write_callback,
+ disk_performance,
+ &g_array_index(hooks, LttvTraceHook, 1));
+
+ g_assert(!ret);
+
+ /*iterate through the facility list*/
+ for(k = 0 ; k < hooks->len; k++)
+ {
+ hook = &g_array_index(hooks, LttvTraceHook, k);
+ for(l=0; l<hook->fac_list->len; l++)
+ {
+ thf = g_array_index(hook->fac_list, LttvTraceHookByFacility*, l);
+ lttv_hooks_add(lttv_hooks_by_id_find(disk_performance->event_by_id_hooks, thf->id),
+ thf->h,
+ disk_performance,
+ LTTV_PRIO_DEFAULT);
+
+ }
+ }
+
+ disk_performance->hooks_trace_after = lttv_hooks_new();
+ /* Registers a hook function */
+ lttv_hooks_add(disk_performance->hooks_trace_after, disk_show, disk_performance, LTTV_PRIO_DEFAULT);
+
+ disk_performance->hooks_trace_before = lttv_hooks_new();
+ /* Registers a hook function */
+ lttv_hooks_add(disk_performance->hooks_trace_before, trace_header, disk_performance, LTTV_PRIO_DEFAULT);
+
+ /* Initalize the EventsRequest structure */
+ events_request->owner = disk_performance;
+ events_request->viewer_data = disk_performance;
+ events_request->servicing = FALSE;
+ events_request->start_time = disk_performance->time_window.start_time;
+ events_request->start_position = NULL;
+ events_request->stop_flag = FALSE;
+ events_request->end_time = disk_performance->time_window.end_time;
+ events_request->num_events = G_MAXUINT;
+ events_request->end_position = NULL;
+ events_request->trace = i;
+ events_request->hooks = hooks;
+ events_request->before_chunk_traceset = NULL;
+ events_request->before_chunk_trace = disk_performance->hooks_trace_before;
+ events_request->before_chunk_tracefile= NULL;
+ events_request->event = NULL;
+ events_request->event_by_id = disk_performance->event_by_id_hooks;
+ events_request->after_chunk_tracefile = NULL;
+ events_request->after_chunk_trace = NULL;
+ events_request->after_chunk_traceset = NULL;
+ events_request->before_request = NULL;
+ events_request->after_request = disk_performance->hooks_trace_after;
+
+ lttvwindow_events_request(disk_performance->tab, events_request);
}
- if(disk_performance->disk_array->len)
- g_array_remove_range (disk_performance->disk_array,0,disk_performance->disk_array->len);
- return FALSE;
-}
-
-static gboolean trace_header(void *hook_data, void *call_data){
- return FALSE;
-}
-
-void request_event(DiskPerformanceData *disk_performance){
-
- disk_performance->event_hooks = lttv_hooks_new();
- lttv_hooks_add(disk_performance->event_hooks, parse_event, disk_performance, LTTV_PRIO_DEFAULT);
-
- disk_performance->hooks_trace_after = lttv_hooks_new();
- lttv_hooks_add(disk_performance->hooks_trace_after, disk_show, disk_performance, LTTV_PRIO_DEFAULT);
-
- disk_performance->hooks_trace_before = lttv_hooks_new();
- lttv_hooks_add(disk_performance->hooks_trace_before, trace_header, disk_performance, LTTV_PRIO_DEFAULT);
-
- EventsRequest *events_request = g_new(EventsRequest, 1);
- events_request->owner = disk_performance;
- events_request->viewer_data = disk_performance;
- events_request->servicing = FALSE;
- events_request->start_time = disk_performance->time_window.start_time;
- events_request->start_position = NULL;
- events_request->stop_flag = FALSE;
- events_request->end_time = disk_performance->time_window.end_time;
- events_request->num_events = G_MAXUINT;
- events_request->end_position = NULL;
- events_request->trace = 0;
- events_request->hooks = NULL;
- events_request->before_chunk_traceset = NULL;
- events_request->before_chunk_trace = disk_performance->hooks_trace_before;
- events_request->before_chunk_tracefile= NULL;
- events_request->event = disk_performance->event_hooks;
- events_request->event_by_id = NULL;
- events_request->after_chunk_tracefile = NULL;
- events_request->after_chunk_trace = NULL;
- events_request->after_chunk_traceset = NULL;
- events_request->before_request = NULL;
- events_request->after_request = disk_performance->hooks_trace_after;
-
- lttvwindow_events_request(disk_performance->tab, events_request);
-
-}
-
-static gboolean disk_update_time_window(void * hook_data, void * call_data){
-
- DiskPerformanceData *disk_performance = (DiskPerformanceData *) hook_data;
- const TimeWindowNotifyData *time_window_nofify_data = ((const TimeWindowNotifyData *)call_data);
- disk_performance->time_window = *time_window_nofify_data->new_time_window;
- /*
- printf("end_time: %ld.%ld\n", disk_performance->time_window.end_time.tv_sec,disk_performance->time_window.end_time.tv_nsec);
- */
- Tab *tab = disk_performance->tab;
- lttvwindow_events_request_remove_all(tab, disk_performance);
- request_event( disk_performance);
-
- return FALSE;
}
-void tree_v_size_allocate_cb (GtkWidget *widget, GtkAllocation *alloc, gpointer data){
- g_info("enter tree_v_size_allocate_cb\n");
-}
-
-void tree_v_size_request_cb (GtkWidget *widget, GtkRequisition *requisition, gpointer data){
-
-}
-
-static void tree_v_cursor_changed_cb (GtkWidget *widget, gpointer data){
-
+/**
+ * This function is called whenever a read event occurs.
+ *
+ */
+static gboolean block_read_callback(void *hook_data, void *call_data)
+{
+ LttEvent *e;
+ LttTime event_time;
+ unsigned cpu_id;
+ lttv_block block_read;
+ char *diskname;
+
+ LttvTracefileContext *tfc = (LttvTracefileContext *)call_data;
+ LttvTracefileState *tfs = (LttvTracefileState *)call_data;
+ DiskPerformanceData *disk_performance = (DiskPerformanceData *)hook_data;
+ GArray *disk_array = disk_performance->disk_array;
+ e = ltt_tracefile_get_event(tfc->tf);
+ event_time = ltt_event_time(e);
+ cpu_id = ltt_event_cpu_id(e);
+ if ((ltt_time_compare(event_time,disk_performance->time_window.start_time) == TRUE) &&
+ (ltt_time_compare(disk_performance->time_window.end_time,event_time) == TRUE))
+ {
+ get_event_detail(e, &block_read);
+ diskname = major_minor_to_diskname(&block_read);
+ sum_data(diskname, block_read.size,LTTV_READ_OPERATION, disk_array);
+
+
+ }
+ return FALSE;
}
-static void tree_v_move_cursor_cb (GtkWidget *widget, GtkMovementStep arg1, gint arg2, gpointer data){
+/**
+ * This function is called whenever a write event occurs.
+ *
+ */
+static gboolean block_write_callback(void *hook_data, void *call_data)
+{
+ LttEvent *e;
+ LttTime event_time;
+ unsigned cpu_id;
+ lttv_block block_write;
+ char *diskname;
+ LttvTracefileContext *tfc = (LttvTracefileContext *)call_data;
+ LttvTracefileState *tfs = (LttvTracefileState *)call_data;
+ DiskPerformanceData *disk_performance = (DiskPerformanceData *)hook_data;
+ GArray *disk_array = disk_performance->disk_array;
+ e = ltt_tracefile_get_event(tfc->tf);
+ event_time = ltt_event_time(e);
+ cpu_id = ltt_event_cpu_id(e);
+ if ((ltt_time_compare(event_time,disk_performance->time_window.start_time) == TRUE) &&
+ (ltt_time_compare(disk_performance->time_window.end_time,event_time) == TRUE))
+ {
+ get_event_detail(e, &block_write);
+ diskname = major_minor_to_diskname(&block_write);
+ sum_data(diskname, block_write.size,LTTV_WRITE_OPERATION, disk_array);
+ }
+ return FALSE;
}
-static void tree_selection_changed_cb (GtkTreeSelection *selection, gpointer data){
-}
-void gui_disperformance_free(DiskPerformanceData *eventdata){
- Tab *tab = eventdata->tab;
- g_info("disperformance.c : gui_disperformance_free, %p", eventdata);
- g_info("%p, %p", eventdata, tab);
- if(tab != NULL)
+/**
+ * This function extracts the major, minor and size
+ *
+ */
+static void get_event_detail(LttEvent *e, lttv_block* disk_data)
+{
+ guint i, num_fields;
+ LttEventType *event_type;
+ LttField *element;
+ LttField *field;
+ event_type = ltt_event_eventtype(e);
+ num_fields = ltt_eventtype_num_fields(event_type);
+
+ for(i = 0 ; i < num_fields ; i++)
{
- g_array_free (eventdata->disk_array, TRUE);
-
- lttvwindow_unregister_time_window_notify(tab,
- disk_update_time_window,
- eventdata);
-
- lttvwindow_events_request_remove_all(eventdata->tab,
- eventdata);
- g_disk_data_list = g_slist_remove(g_disk_data_list, eventdata);
+ element = ltt_eventtype_field(event_type,i);
+ if(i== 0)
+ disk_data->major_number = ltt_event_get_long_unsigned(e, element);
+ if(i== 1)
+ disk_data->minor_number = ltt_event_get_long_unsigned(e, element);
+ if(i==2)
+ disk_data->size = ltt_event_get_long_unsigned(e, element);
}
- g_free(eventdata);
- g_info("disperformance.c : gui_disperformance_free end, %p", eventdata);
+
}
-
-static char * major_minor_to_diskname( lttv_block* disk_data){
+/**
+ * This function convert the major and minor number to the corresponding disk
+ *
+ */
+static char * major_minor_to_diskname( lttv_block* disk_data)
+{
if (disk_data->major_number == 3 && disk_data->minor_number == 0)
return "hda";
if (disk_data->major_number == 4 && disk_data->minor_number == 0)
return "hdb";
}
-
-static void sum_data(char* diskname, guint size, enum operation_t operation, GArray *disk_array){
+/**
+ * This function calculates: the number of operations, the total bytes read or written,
+ * the average number of bytes read or written by sec.
+ */
+static void sum_data(char* diskname, guint size, enum operation_t operation, GArray *disk_array)
+{
lttv_total_block data;
lttv_total_block *element;
}
}
-static void get_event_detail(LttEvent *e, LttField *f, GString * s, lttv_block* disk_data){
- LttType *type;
- LttField *element;
- //char *name;
- GQuark name;
- int nb, i;
- static int count;
- type = ltt_field_type(f);
- switch(ltt_type_class(type)) {
- case LTT_INT:
- g_string_append_printf(s, " %ld", ltt_event_get_long_int(e,f));
- break;
-
- case LTT_UINT:
- g_string_append_printf(s, " %lu", ltt_event_get_long_unsigned(e,f));
- break;
-
- case LTT_FLOAT:
- g_string_append_printf(s, " %g", ltt_event_get_double(e,f));
- break;
-
- case LTT_STRING:
- g_string_append_printf(s, " \"%s\"", ltt_event_get_string(e,f));
- break;
-
- case LTT_ENUM:
- g_string_append_printf(s, " %s", ltt_enum_string_get(type,
- ltt_event_get_unsigned(e,f)-1));
- break;
-
- case LTT_ARRAY:
- case LTT_SEQUENCE:
- g_string_append_printf(s, " {");
- nb = ltt_event_field_element_number(e,f);
- element = ltt_field_element(f);
- for(i = 0 ; i < nb ; i++) {
- ltt_event_field_element_select(e,f,i);
- get_event_detail(e, element, s, disk_data);
- }
- g_string_append_printf(s, " }");
- break;
-
- case LTT_STRUCT:
- g_string_append_printf(s, " {");
- nb = ltt_type_member_number(type);
- for(i = 0 ; i < nb ; i++) {
- element = ltt_field_member(f,i);
- ltt_type_member_type(type, i, &name);
- g_string_append_printf(s, " %s = ", name);
- if(i== 0)
- disk_data->major_number = ltt_event_get_long_unsigned(e, element);
- if(i== 1)
- disk_data->minor_number = ltt_event_get_long_unsigned(e, element);
- if(i==2)
- disk_data->size = ltt_event_get_long_unsigned(e, element);
- }
- g_string_append_printf(s, " }");
- break;
-
- case LTT_UNION:
- g_string_append_printf(s, " {");
- nb = ltt_type_member_number(type);
- for(i = 0 ; i < nb ; i++) {
- element = ltt_field_member(f,i);
- ltt_type_member_type(type, i, &name);
- g_string_append_printf(s, " %s = ", name);
- get_event_detail(e, element, s, disk_data);
- }
- g_string_append_printf(s, " }");
- break;
-
- }
-}
-
-
-gboolean parse_event(void *hook_data, void *call_data){
-
- static LttTime time_entry, previous_time, event_time;
- LttEvent *e;
- LttField *field;
- LttEventType *event_type;
- gint i;
- unsigned cpu_id;
- lttv_block block_read, block_write;
- char *diskname;
-
- gboolean notFound = FALSE;
- DiskPerformanceData * disk_performance = (DiskPerformanceData *)hook_data;
- GArray *disk_array = disk_performance->disk_array; // pho
- LttvTracefileContext *tfc = (LttvTracefileContext *)call_data;
- LttvTracefileState *tfs = (LttvTracefileState *)call_data;
-
- //e = tfc->e;
- e = ltt_tracefile_get_event(tfc->tf);
- previous_time = event_time;
- field = ltt_event_field(e);
- event_time = ltt_event_time(e);
- event_type = ltt_event_eventtype(e);
- cpu_id = ltt_event_cpu_id(e);
- GString * detail_event = g_string_new("");
-
- if ((ltt_time_compare(event_time,disk_performance->time_window.start_time) == TRUE) &&
- (ltt_time_compare(disk_performance->time_window.end_time,event_time) == TRUE)){
- if (strcmp( g_quark_to_string(ltt_eventtype_name(event_type)),"block_read") == 0) {
- get_event_detail(e, field, detail_event, &block_read);
- diskname = major_minor_to_diskname(&block_read);
- sum_data(diskname, block_read.size,LTTV_READ_OPERATION, disk_array);
-
- }
- if (strcmp( g_quark_to_string(ltt_eventtype_name(event_type)),"block_write") == 0) {
- get_event_detail(e, field, detail_event, &block_write);
- diskname = major_minor_to_diskname(&block_write);
- sum_data(diskname, block_write.size,LTTV_WRITE_OPERATION, disk_array);
- }
-
- }
- g_string_free(detail_event, TRUE);
- return FALSE;
-}
-
-
-void disk_destructor_full(DiskPerformanceData *disk_data)
-{
-
- if(GTK_IS_WIDGET(disk_data->hbox_v))
- gtk_widget_destroy(disk_data->hbox_v);
-
-}
-
-static void disk_destroy_walk(gpointer data, gpointer user_data)
-{
- g_info("Walk destroy GUI disk performance Viewer");
- disk_destructor_full((DiskPerformanceData*)data);
-}
-
-static void init()
-{
-
- g_info("Init diskPerformance.c");
-
- lttvwindow_register_constructor("diskperformance",
- "/",
- "Insert Disk Performance",
- hDiskPerformanceInsert_xpm,
- "Insert Disk Performance",
- disk_performance);
-
-}
-
-
static void destroy()
{
g_info("Destroy diskPerformance");