#define PATH_LENGTH 256
static LttvModule *statistic_main_win_module;
+static GPtrArray * statistic_traceset;
/** Array containing instanced objects. Used when module is unloaded */
static GSList *g_statistic_viewer_data_list = NULL ;
void show_traceset_stats(StatisticViewerData * statistic_viewer_data);
void show_tree(StatisticViewerData * statistic_viewer_data,
- LttvAttribute* stats, GtkTreeIter* parent);
+ LttvAttribute* stats, GtkTreeIter* parent);
void show_statistic(StatisticViewerData * statistic_viewer_data,
- LttvAttribute* stats, GtkTextBuffer* buf);
+ LttvAttribute* stats, GtkTextBuffer* buf);
/** hook functions for update time interval, current time ... */
gboolean statistic_show_viewer(void * hook_data, void * call_data);
gboolean statistic_traceset_changed(void * hook_data, void * call_data);
void statistic_add_context_hooks(StatisticViewerData * statistic_viewer_data,
- LttvTracesetContext * tsc);
+ LttvTracesetContext * tsc);
void statistic_remove_context_hooks(StatisticViewerData * statistic_viewer_data,
- LttvTracesetContext * tsc);
+ LttvTracesetContext * tsc);
+
+gboolean statistic_insert_traceset_stats(void * stats);
enum
{
struct _StatisticViewerData{
MainWindow * mw;
LttvTracesetStats * stats;
+ gboolean calculate_stats;
+ int size;
TimeInterval time_span;
gboolean shown; //indicate if the statistic is shown or not
g_critical("Can't load Statistic Viewer : missing mainwin\n");
return;
}
-
+
+ statistic_traceset = g_ptr_array_new ();
+
/* Register the toolbar insert button */
toolbar_item_reg(hGuiStatisticInsert_xpm, "Insert Statistic Viewer", h_gui_statistic);
g_slist_foreach(g_statistic_viewer_data_list, statistic_destroy_walk, NULL );
g_slist_free(g_statistic_viewer_data_list);
}
+ g_ptr_array_free (statistic_traceset, TRUE);
/* Unregister the toolbar insert button */
toolbar_item_unreg(h_gui_statistic);
-
+
/* Unregister the menu item insert entry */
menu_item_unreg(h_gui_statistic);
}
if(statistic_viewer_data)
return statistic_viewer_data->hpaned_v;
else return NULL;
-
+
+}
+
+gboolean statistic_insert_traceset_stats(void * stats)
+{
+ int i, len;
+ gpointer s;
+
+ len = statistic_traceset->len;
+ for(i=0;i<len;i++){
+ s = g_ptr_array_index(statistic_traceset, i);
+ if(s == stats) break;
+ }
+ if(i==len){
+ g_ptr_array_add(statistic_traceset, stats);
+ return TRUE;
+ }
+ return FALSE;
}
/**
statistic_viewer_data->mw = parent_window;
statistic_viewer_data->stats = get_traceset_stats_api(statistic_viewer_data->mw);
+ statistic_viewer_data->calculate_stats = statistic_insert_traceset_stats((void *)statistic_viewer_data->stats);
reg_update_time_window(statistic_update_time_window,statistic_viewer_data, statistic_viewer_data->mw);
reg_show_viewer(statistic_show_viewer,statistic_viewer_data, statistic_viewer_data->mw);
reg_update_traceset(statistic_traceset_changed,statistic_viewer_data, statistic_viewer_data->mw);
statistic_viewer_data->statistic_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
- statistic_destroy_hash_key,
- statistic_destroy_hash_data);
+ statistic_destroy_hash_key,
+ statistic_destroy_hash_data);
statistic_viewer_data->hpaned_v = gtk_hpaned_new();
statistic_viewer_data->store_m = gtk_tree_store_new (N_COLUMNS, G_TYPE_STRING);
g_object_unref (G_OBJECT (statistic_viewer_data->store_m));
g_signal_connect (G_OBJECT (statistic_viewer_data->tree_v), "grab-focus",
- G_CALLBACK (grab_focus),
- statistic_viewer_data);
+ G_CALLBACK (grab_focus),
+ statistic_viewer_data);
// Setup the selection handler
statistic_viewer_data->select_c = gtk_tree_view_get_selection (GTK_TREE_VIEW (statistic_viewer_data->tree_v));
gtk_tree_selection_set_mode (statistic_viewer_data->select_c, GTK_SELECTION_SINGLE);
g_signal_connect (G_OBJECT (statistic_viewer_data->select_c), "changed",
- G_CALLBACK (tree_selection_changed_cb),
- statistic_viewer_data);
+ G_CALLBACK (tree_selection_changed_cb),
+ statistic_viewer_data);
renderer = gtk_cell_renderer_text_new ();
column = gtk_tree_view_column_new_with_attributes ("Statistic Name",
- renderer,
- "text", NAME_COLUMN,
- NULL);
+ renderer,
+ "text", NAME_COLUMN,
+ NULL);
gtk_tree_view_column_set_alignment (column, 0.0);
// gtk_tree_view_column_set_fixed_width (column, 45);
gtk_tree_view_append_column (GTK_TREE_VIEW (statistic_viewer_data->tree_v), column);
statistic_viewer_data->scroll_win_tree = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(statistic_viewer_data->scroll_win_tree),
- GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
+ GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
gtk_container_add (GTK_CONTAINER (statistic_viewer_data->scroll_win_tree), statistic_viewer_data->tree_v);
gtk_paned_pack1(GTK_PANED(statistic_viewer_data->hpaned_v),statistic_viewer_data->scroll_win_tree, TRUE, FALSE);
statistic_viewer_data->scroll_win_text = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(statistic_viewer_data->scroll_win_text),
- GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
+ GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
statistic_viewer_data->text_v = gtk_text_view_new ();
g_signal_connect (G_OBJECT (statistic_viewer_data->text_v), "grab-focus",
- G_CALLBACK (grab_focus),
- statistic_viewer_data);
+ G_CALLBACK (grab_focus),
+ statistic_viewer_data);
gtk_text_view_set_editable(GTK_TEXT_VIEW(statistic_viewer_data->text_v),FALSE);
gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(statistic_viewer_data->text_v),FALSE);
statistic_viewer_data->shown = FALSE;
statistic_viewer_data->filter_key = g_strdup(key);
g_object_set_data(
- G_OBJECT(statistic_viewer_data->hpaned_v),
- statistic_viewer_data->filter_key,
- s);
+ G_OBJECT(statistic_viewer_data->hpaned_v),
+ statistic_viewer_data->filter_key,
+ s);
g_object_set_data(
- G_OBJECT(statistic_viewer_data->hpaned_v),
- TRACESET_TIME_SPAN,
- &statistic_viewer_data->time_span);
+ G_OBJECT(statistic_viewer_data->hpaned_v),
+ TRACESET_TIME_SPAN,
+ &statistic_viewer_data->time_span);
+
+ if(statistic_viewer_data->calculate_stats){
+ if(lttv_stats_load_statistics(statistic_viewer_data->stats))
+ statistic_viewer_data->calculate_stats = FALSE;
+ }
+
+ if(statistic_viewer_data->calculate_stats == FALSE){
+ statistic_viewer_data->size = 1;
+ g_object_set_data(
+ G_OBJECT(statistic_viewer_data->hpaned_v),
+ MAX_NUMBER_EVENT,
+ &statistic_viewer_data->size);
+ }
g_object_set_data_full(
- G_OBJECT(statistic_viewer_data->hpaned_v),
- "statistic_viewer_data",
- statistic_viewer_data,
- (GDestroyNotify)gui_statistic_free);
+ G_OBJECT(statistic_viewer_data->hpaned_v),
+ "statistic_viewer_data",
+ statistic_viewer_data,
+ (GDestroyNotify)gui_statistic_free);
/* Add the object's information to the module's array */
g_statistic_viewer_data_list = g_slist_append(
- g_statistic_viewer_data_list,
- statistic_viewer_data);
+ g_statistic_viewer_data_list,
+ statistic_viewer_data);
return statistic_viewer_data;
}
gtk_tree_store_append (store, &iter, NULL);
gtk_tree_store_set (store, &iter,
- NAME_COLUMN, "Traceset statistics",
- -1);
- path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
+ NAME_COLUMN, "Traceset statistics",
+ -1);
+ path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
str = gtk_tree_path_to_string (path);
g_hash_table_insert(statistic_viewer_data->statistic_hash,
- (gpointer)str, tscs->stats);
+ (gpointer)str, tscs->stats);
show_tree(statistic_viewer_data, tscs->stats, &iter);
//show stats for all traces
tcs = (LttvTraceStats *)(LTTV_TRACESET_CONTEXT(tscs)->traces[i]);
desc = ltt_trace_system_description(tcs->parent.parent.t);
sprintf(trace_str, "Trace on system %s at time %d secs",
- ltt_trace_system_description_node_name(desc),
- (ltt_trace_system_description_trace_start_time(desc)).tv_sec);
+ ltt_trace_system_description_node_name(desc),
+ (ltt_trace_system_description_trace_start_time(desc)).tv_sec);
gtk_tree_store_append (store, &iter, NULL);
gtk_tree_store_set (store, &iter,NAME_COLUMN,trace_str,-1);
path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
str = gtk_tree_path_to_string (path);
g_hash_table_insert(statistic_viewer_data->statistic_hash,
- (gpointer)str,tcs->stats);
+ (gpointer)str,tcs->stats);
show_tree(statistic_viewer_data, tcs->stats, &iter);
}
}
void show_tree(StatisticViewerData * statistic_viewer_data,
- LttvAttribute* stats, GtkTreeIter* parent)
+ LttvAttribute* stats, GtkTreeIter* parent)
{
int i, nb;
LttvAttribute *subtree;
switch(type) {
case LTTV_GOBJECT:
if(LTTV_IS_ATTRIBUTE(*(value.v_gobject))) {
- sprintf(dir_str, "%s", g_quark_to_string(name));
+ sprintf(dir_str, "%s", g_quark_to_string(name));
subtree = (LttvAttribute *)*(value.v_gobject);
- gtk_tree_store_append (store, &iter, parent);
- gtk_tree_store_set (store, &iter,NAME_COLUMN,dir_str,-1);
- path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
- str = gtk_tree_path_to_string (path);
- g_hash_table_insert(statistic_viewer_data->statistic_hash,
- (gpointer)str, subtree);
+ gtk_tree_store_append (store, &iter, parent);
+ gtk_tree_store_set (store, &iter,NAME_COLUMN,dir_str,-1);
+ path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
+ str = gtk_tree_path_to_string (path);
+ g_hash_table_insert(statistic_viewer_data->statistic_hash,
+ (gpointer)str, subtree);
show_tree(statistic_viewer_data, subtree, &iter);
}
break;
default:
- break;
+ break;
}
}
}
void show_statistic(StatisticViewerData * statistic_viewer_data,
- LttvAttribute* stats, GtkTextBuffer* buf)
+ LttvAttribute* stats, GtkTextBuffer* buf)
{
int i, nb , flag;
LttvAttribute *subtree;
StatisticViewerData *statistic_viewer_data = (StatisticViewerData*) hook_data;
LttvTracesetContext * tsc = get_traceset_context(statistic_viewer_data->mw);
+ //if statistic is already calculated, do nothing
+ if(!statistic_viewer_data->calculate_stats){
+ return FALSE;
+ }
+
if(statistic_viewer_data->shown == FALSE){
statistic_add_context_hooks(statistic_viewer_data, tsc);
}
if(statistic_viewer_data->shown == FALSE){
statistic_viewer_data->shown = TRUE;
show_traceset_stats(statistic_viewer_data);
- statistic_remove_context_hooks(statistic_viewer_data,tsc);
+ if(statistic_viewer_data->calculate_stats){
+ statistic_remove_context_hooks(statistic_viewer_data,tsc);
+ lttv_stats_save_statistics((LttvTracesetStats*)tsc);
+ }
}
return FALSE;
}
void statistic_add_context_hooks(StatisticViewerData * statistic_viewer_data,
- LttvTracesetContext * tsc)
+ LttvTracesetContext * tsc)
{
gint i, j, nbi, nb_tracefile, nb_control, nb_per_cpu;
LttTrace *trace;
gboolean selected;
ts_s = (LttvTracesetSelector*)g_object_get_data(G_OBJECT(statistic_viewer_data->hpaned_v),
- statistic_viewer_data->filter_key);
+ statistic_viewer_data->filter_key);
//if there are hooks for traceset, add them here
nbi = lttv_traceset_number(tsc->ts);
for(i = 0 ; i < nbi ; i++) {
- t_s = lttv_traceset_selector_get(ts_s,i);
+ t_s = lttv_traceset_selector_trace_get(ts_s,i);
selected = lttv_trace_selector_get_selected(t_s);
if(!selected) continue;
tc = tsc->traces[i];
nb_tracefile = nb_control + nb_per_cpu;
for(j = 0 ; j < nb_tracefile ; j++) {
- tf_s = lttv_trace_selector_get(t_s,j);
+ tf_s = lttv_trace_selector_tracefile_get(t_s,j);
selected = lttv_tracefile_selector_get_selected(tf_s);
if(!selected) continue;
if(j < nb_control)
- tfc = tc->control_tracefiles[j];
+ tfc = tc->control_tracefiles[j];
else
- tfc = tc->per_cpu_tracefiles[j - nb_control];
+ tfc = tc->per_cpu_tracefiles[j - nb_control];
//if there are hooks for tracefile, add them here
// lttv_tracefile_context_add_hooks(tfc, NULL,NULL,NULL,NULL,
- // statistic_viewer_data->before_event_hooks,NULL);
+ // statistic_viewer_data->before_event_hooks,NULL);
}
}
//add state and stats hooks
- state_add_event_hooks_api(statistic_viewer_data->mw);
+ //state_add_event_hooks_api(statistic_viewer_data->mw); //it will be added in the main window
stats_add_event_hooks_api(statistic_viewer_data->mw);
}
void statistic_remove_context_hooks(StatisticViewerData * statistic_viewer_data,
- LttvTracesetContext * tsc)
+ LttvTracesetContext * tsc)
{
gint i, j, nbi, nb_tracefile, nb_control, nb_per_cpu;
LttTrace *trace;
gboolean selected;
ts_s = (LttvTracesetSelector*)g_object_get_data(G_OBJECT(statistic_viewer_data->hpaned_v),
- statistic_viewer_data->filter_key);
+ statistic_viewer_data->filter_key);
//if there are hooks for traceset, remove them here
nbi = lttv_traceset_number(tsc->ts);
for(i = 0 ; i < nbi ; i++) {
- t_s = lttv_traceset_selector_get(ts_s,i);
+ t_s = lttv_traceset_selector_trace_get(ts_s,i);
selected = lttv_trace_selector_get_selected(t_s);
if(!selected) continue;
tc = tsc->traces[i];
nb_tracefile = nb_control + nb_per_cpu;
for(j = 0 ; j < nb_tracefile ; j++) {
- tf_s = lttv_trace_selector_get(t_s,j);
+ tf_s = lttv_trace_selector_tracefile_get(t_s,j);
selected = lttv_tracefile_selector_get_selected(tf_s);
if(!selected) continue;
if(j < nb_control)
- tfc = tc->control_tracefiles[j];
+ tfc = tc->control_tracefiles[j];
else
- tfc = tc->per_cpu_tracefiles[j - nb_control];
+ tfc = tc->per_cpu_tracefiles[j - nb_control];
//if there are hooks for tracefile, remove them here
// lttv_tracefile_context_remove_hooks(tfc, NULL,NULL,NULL,NULL,
- // statistic_viewer_data->before_event_hooks,NULL);
+ // statistic_viewer_data->before_event_hooks,NULL);
}
}
//remove state and stats hooks
- state_remove_event_hooks_api(statistic_viewer_data->mw);
+ //state_remove_event_hooks_api(statistic_viewer_data->mw); //it will be done in the main window
stats_remove_event_hooks_api(statistic_viewer_data->mw);
}