From 4ea3dbbf588bab481811793d3be57939c5c4cf2f Mon Sep 17 00:00:00 2001 From: peterho Date: Mon, 1 May 2006 19:02:44 +0000 Subject: [PATCH] Used event_by_id git-svn-id: http://ltt.polymtl.ca/svn@1780 04897980-b3bd-0310-b5e0-8ef037075253 --- .../gui/diskperformance/diskperformance.c | 683 ++++++++++-------- 1 file changed, 364 insertions(+), 319 deletions(-) diff --git a/ltt/branches/poly/lttv/modules/gui/diskperformance/diskperformance.c b/ltt/branches/poly/lttv/modules/gui/diskperformance/diskperformance.c index cee71c65..1131e7f1 100644 --- a/ltt/branches/poly/lttv/modules/gui/diskperformance/diskperformance.c +++ b/ltt/branches/poly/lttv/modules/gui/diskperformance/diskperformance.c @@ -22,11 +22,9 @@ #include #include #include - #include #include #include - #include #include #include @@ -45,6 +43,7 @@ #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{ @@ -57,6 +56,7 @@ enum{ NUM_WR_COLUMN, N_COLUMNS }; + enum operation_t { LTTV_READ_OPERATION = 1, LTTV_WRITE_OPERATION @@ -65,22 +65,30 @@ enum operation_t { 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; @@ -101,35 +109,176 @@ typedef struct _lttv_total_block { 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; @@ -150,39 +299,26 @@ DiskPerformanceData *disk_performance_data(Tab *tab){ 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, @@ -247,10 +383,7 @@ DiskPerformanceData *disk_performance_data(Tab *tab){ 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); @@ -269,157 +402,219 @@ DiskPerformanceData *disk_performance_data(Tab *tab){ 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; itraces[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; lfac_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; @@ -470,157 +665,7 @@ static void sum_data(char* diskname, guint size, enum operation_t operation, GAr } } -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"); -- 2.34.1