1 /* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2003-2004 XangXiu Yang
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation;
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
29 #include <ltt/event.h>
30 #include <ltt/trace.h>
32 #include <lttv/lttv.h>
33 #include <lttv/module.h>
34 #include <lttv/tracecontext.h>
35 #include <lttv/hook.h>
36 #include <lttv/state.h>
37 #include <lttv/stats.h>
39 #include <lttvwindow/lttvwindow.h>
40 #include <lttvwindow/lttvwindowtraces.h>
41 #include <lttvwindow/lttv_plugin_tab.h>
43 #include "hGuiStatisticInsert.xpm"
45 #define PATH_LENGTH 256 /* CHECK */
46 #define MAX_NUMBER_EVENT "max_number_event"
49 //static GPtrArray * statistic_traceset;
51 /** Array containing instanced objects. Used when module is unloaded */
52 static GSList
*g_statistic_viewer_data_list
= NULL
;
54 typedef struct _StatisticViewerData StatisticViewerData
;
56 static void request_background_data(StatisticViewerData
*svd
);
57 GtkWidget
*guistatistic_get_widget(StatisticViewerData
*svd
);
59 //! Statistic Viewer's constructor hook
60 GtkWidget
*h_gui_statistic(LttvPlugin
*plugin
);
61 //! Statistic Viewer's constructor
62 StatisticViewerData
*gui_statistic(LttvPluginTab
*ptab
);
63 //! Statistic Viewer's destructor
64 void gui_statistic_destructor(StatisticViewerData
*statistic_viewer_data
);
66 static void tree_selection_changed_cb (GtkTreeSelection
*selection
, gpointer data
);
68 void statistic_destroy_hash_key(gpointer key
);
69 void statistic_destroy_hash_data(gpointer data
);
71 void show_traceset_stats(StatisticViewerData
* statistic_viewer_data
);
72 void show_tree(StatisticViewerData
* statistic_viewer_data
,
73 LttvAttribute
* stats
, GtkTreeIter
* parent
);
74 void show_statistic(StatisticViewerData
* statistic_viewer_data
,
75 LttvAttribute
* stats
, GtkTextBuffer
* buf
);
78 gboolean
statistic_traceset_changed(void * hook_data
, void * call_data
);
79 //void statistic_add_context_hooks(StatisticViewerData * statistic_viewer_data,
80 // LttvTracesetContext * tsc);
81 //void statistic_remove_context_hooks(StatisticViewerData *statistic_viewer_data,
82 // LttvTracesetContext * tsc);
84 //gboolean statistic_insert_traceset_stats(void * stats);
92 struct _StatisticViewerData
{
95 //LttvTracesetStats * stats;
98 //gboolean shown; //indicate if the statistic is shown or not
101 GtkWidget
* hpaned_v
;
102 GtkTreeStore
* store_m
;
105 //scroll window containing Tree View
106 GtkWidget
* scroll_win_tree
;
109 //scroll window containing Text View
110 GtkWidget
* scroll_win_text
;
113 GtkTreeSelection
*select_c
;
116 GHashTable
*statistic_hash
;
118 guint background_info_waiting
;
119 guint live_trace_count
;
125 /* Action to do when background computation completed.
127 * Eventually, will have to check that every requested traces are finished
128 * before doing the redraw. It will save unnecessary processor usage.
131 static gint
background_ready(void *hook_data
, void *call_data
)
133 StatisticViewerData
*svd
= (StatisticViewerData
*)hook_data
;
136 svd
->background_info_waiting
--;
138 if(svd
->background_info_waiting
== 0) {
139 g_message("statistics viewer : background computation data ready.");
141 gtk_tree_store_clear (svd
->store_m
);
143 lttv_stats_sum_traceset(lttvwindow_get_traceset_stats(tab
),
145 show_traceset_stats(svd
);
151 /* Request background computation. Verify if it is in progress or ready first.
153 * Right now, for all loaded traces.
155 * Later : must be only for each trace in the tab's traceset.
157 static void request_background_data(StatisticViewerData
*svd
)
159 gint num_traces
= lttvwindowtraces_get_number();
164 LttvHooks
*background_ready_hook
=
166 lttv_hooks_add(background_ready_hook
, background_ready
, svd
,
168 svd
->background_info_waiting
= num_traces
;
169 buf
= gtk_text_view_get_buffer((GtkTextView
*)svd
->text_v
);
170 gtk_text_buffer_set_text(buf
,"", -1);
172 for(i
=0;i
<num_traces
;i
++) {
173 trace
= lttvwindowtraces_get_trace(i
);
175 if(lttvwindowtraces_get_ready(g_quark_from_string("stats"),trace
)==FALSE
) {
177 if(lttvwindowtraces_get_in_progress(g_quark_from_string("stats"),
179 /* We first remove requests that could have been done for the same
180 * information. Happens when two viewers ask for it before servicing
183 if(!lttvwindowtraces_background_request_find(trace
, "stats"))
184 lttvwindowtraces_background_request_queue(
185 main_window_get_widget(svd
->tab
), trace
, "stats");
186 lttvwindowtraces_background_notify_queue(svd
,
190 background_ready_hook
);
191 } else { /* in progress */
192 lttvwindowtraces_background_notify_current(svd
,
196 background_ready_hook
);
201 lttv_hooks_call(background_ready_hook
, NULL
);
205 if(num_traces
== 0) {
206 svd
->background_info_waiting
= 1;
207 lttv_hooks_call(background_ready_hook
, NULL
);
209 lttv_hooks_destroy(background_ready_hook
);
213 GtkWidget
*guistatistic_get_widget(StatisticViewerData
*svd
)
215 return svd
->hpaned_v
;
220 gui_statistic_destructor(StatisticViewerData
*statistic_viewer_data
)
222 Tab
*tab
= statistic_viewer_data
->tab
;
224 /* May already been done by GTK window closing */
225 if(GTK_IS_WIDGET(guistatistic_get_widget(statistic_viewer_data
))){
226 g_info("widget still exists");
229 lttvwindow_unregister_traceset_notify(statistic_viewer_data
->tab
,
230 statistic_traceset_changed
,
231 statistic_viewer_data
);
233 lttvwindowtraces_background_notify_remove(statistic_viewer_data
);
235 g_hash_table_destroy(statistic_viewer_data
->statistic_hash
);
236 g_statistic_viewer_data_list
=
237 g_slist_remove(g_statistic_viewer_data_list
, statistic_viewer_data
);
238 g_free(statistic_viewer_data
);
243 * Statistic Viewer's constructor hook
245 * This constructor is given as a parameter to the menuitem and toolbar button
246 * registration. It creates the list.
247 * @param parent_window A pointer to the parent window.
248 * @return The widget created.
251 h_gui_statistic(LttvPlugin
*plugin
)
253 LttvPluginTab
*ptab
= LTTV_PLUGIN_TAB(plugin
);
254 StatisticViewerData
* statistic_viewer_data
= gui_statistic(ptab
) ;
256 if(statistic_viewer_data
)
257 return guistatistic_get_widget(statistic_viewer_data
);
263 gboolean
statistic_insert_traceset_stats(void * stats
)
268 len
= statistic_traceset
->len
;
270 s
= g_ptr_array_index(statistic_traceset
, i
);
271 if(s
== stats
) break;
274 g_ptr_array_add(statistic_traceset
, stats
);
282 * Statistic Viewer's constructor
284 * This constructor is used to create StatisticViewerData data structure.
285 * @return The Statistic viewer data created.
287 StatisticViewerData
*
288 gui_statistic(LttvPluginTab
*ptab
)
290 GtkCellRenderer
*renderer
;
291 GtkTreeViewColumn
*column
;
293 StatisticViewerData
* statistic_viewer_data
= g_new(StatisticViewerData
,1);
294 statistic_viewer_data
->live_trace_count
= 0;
295 Tab
*tab
= ptab
->tab
;
296 statistic_viewer_data
->tab
= tab
;
297 statistic_viewer_data
->ptab
= ptab
;
298 // statistic_viewer_data->stats =
299 // lttvwindow_get_traceset_stats(statistic_viewer_data->tab);
300 // statistic_viewer_data->calculate_stats =
301 // statistic_insert_traceset_stats((void *)statistic_viewer_data->stats);
303 lttvwindow_register_traceset_notify(statistic_viewer_data
->tab
,
304 statistic_traceset_changed
,
305 statistic_viewer_data
);
306 statistic_viewer_data
->statistic_hash
= g_hash_table_new_full(g_str_hash
,
308 statistic_destroy_hash_key
,
311 statistic_viewer_data
->hpaned_v
= gtk_hpaned_new();
312 statistic_viewer_data
->store_m
= gtk_tree_store_new (N_COLUMNS
, G_TYPE_STRING
);
313 statistic_viewer_data
->tree_v
=
314 gtk_tree_view_new_with_model (
315 GTK_TREE_MODEL (statistic_viewer_data
->store_m
));
316 g_object_unref (G_OBJECT (statistic_viewer_data
->store_m
));
318 // Setup the selection handler
319 statistic_viewer_data
->select_c
= gtk_tree_view_get_selection (GTK_TREE_VIEW (statistic_viewer_data
->tree_v
));
320 gtk_tree_selection_set_mode (statistic_viewer_data
->select_c
, GTK_SELECTION_SINGLE
);
321 g_signal_connect (G_OBJECT (statistic_viewer_data
->select_c
), "changed",
322 G_CALLBACK (tree_selection_changed_cb
),
323 statistic_viewer_data
);
325 renderer
= gtk_cell_renderer_text_new ();
326 column
= gtk_tree_view_column_new_with_attributes ("Statistic Name",
330 gtk_tree_view_column_set_alignment (column
, 0.0);
331 // gtk_tree_view_column_set_fixed_width (column, 45);
332 gtk_tree_view_append_column (GTK_TREE_VIEW (statistic_viewer_data
->tree_v
), column
);
335 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (statistic_viewer_data
->tree_v
), FALSE
);
337 statistic_viewer_data
->scroll_win_tree
= gtk_scrolled_window_new (NULL
, NULL
);
338 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(statistic_viewer_data
->scroll_win_tree
),
339 GTK_POLICY_AUTOMATIC
,GTK_POLICY_AUTOMATIC
);
341 gtk_container_add (GTK_CONTAINER (statistic_viewer_data
->scroll_win_tree
), statistic_viewer_data
->tree_v
);
342 gtk_paned_pack1(GTK_PANED(statistic_viewer_data
->hpaned_v
),statistic_viewer_data
->scroll_win_tree
, TRUE
, FALSE
);
343 gtk_paned_set_position(GTK_PANED(statistic_viewer_data
->hpaned_v
), 160);
345 statistic_viewer_data
->scroll_win_text
= gtk_scrolled_window_new (NULL
, NULL
);
346 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(statistic_viewer_data
->scroll_win_text
),
347 GTK_POLICY_AUTOMATIC
,GTK_POLICY_AUTOMATIC
);
349 statistic_viewer_data
->text_v
= gtk_text_view_new ();
351 gtk_text_view_set_editable(GTK_TEXT_VIEW(statistic_viewer_data
->text_v
),FALSE
);
352 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(statistic_viewer_data
->text_v
),FALSE
);
353 gtk_container_add (GTK_CONTAINER (statistic_viewer_data
->scroll_win_text
), statistic_viewer_data
->text_v
);
354 gtk_paned_pack2(GTK_PANED(statistic_viewer_data
->hpaned_v
), statistic_viewer_data
->scroll_win_text
, TRUE
, FALSE
);
356 gtk_container_set_border_width(
357 GTK_CONTAINER(statistic_viewer_data
->hpaned_v
), 1);
359 gtk_widget_show(statistic_viewer_data
->scroll_win_tree
);
360 gtk_widget_show(statistic_viewer_data
->scroll_win_text
);
361 gtk_widget_show(statistic_viewer_data
->tree_v
);
362 gtk_widget_show(statistic_viewer_data
->text_v
);
363 gtk_widget_show(statistic_viewer_data
->hpaned_v
);
365 g_object_set_data_full(
366 G_OBJECT(guistatistic_get_widget(statistic_viewer_data
)),
367 "statistic_viewer_data",
368 statistic_viewer_data
,
369 (GDestroyNotify
)gui_statistic_destructor
);
371 /* Add the object's information to the module's array */
372 g_statistic_viewer_data_list
= g_slist_append(
373 g_statistic_viewer_data_list
,
374 statistic_viewer_data
);
376 request_background_data(statistic_viewer_data
);
378 return statistic_viewer_data
;
382 tree_selection_changed_cb (GtkTreeSelection
*selection
, gpointer data
)
384 StatisticViewerData
*statistic_viewer_data
= (StatisticViewerData
*)data
;
386 GtkTreeModel
*model
= GTK_TREE_MODEL(statistic_viewer_data
->store_m
);
391 GtkTextIter text_iter
;
392 LttvAttribute
* stats
;
394 if (gtk_tree_selection_get_selected (selection
, &model
, &iter
))
396 gtk_tree_model_get (model
, &iter
, NAME_COLUMN
, &event
, -1);
398 path
= gtk_tree_model_get_path(GTK_TREE_MODEL(model
),&iter
);
399 str
= gtk_tree_path_to_string (path
);
400 stats
= (LttvAttribute
*)g_hash_table_lookup (statistic_viewer_data
->statistic_hash
,str
);
403 buf
= gtk_text_view_get_buffer((GtkTextView
*)statistic_viewer_data
->text_v
);
404 gtk_text_buffer_set_text(buf
,"Statistic for '", -1);
405 gtk_text_buffer_get_end_iter(buf
, &text_iter
);
406 gtk_text_buffer_insert(buf
, &text_iter
, event
, strlen(event
));
407 gtk_text_buffer_get_end_iter(buf
, &text_iter
);
408 gtk_text_buffer_insert(buf
, &text_iter
, "' :\n\n",5);
410 show_statistic(statistic_viewer_data
, stats
, buf
);
416 void statistic_destroy_hash_key(gpointer key
)
428 static const char *live_msg
= "Statistics for traceset containing live traces are inaccurate";
430 void show_traceset_stats(StatisticViewerData
* statistic_viewer_data
)
432 Tab
*tab
= statistic_viewer_data
->tab
;
436 LttvTracesetStats
* tscs
= lttvwindow_get_traceset_stats(tab
);
437 gchar
* str
, trace_str
[PATH_LENGTH
];
440 GtkTreeStore
* store
= statistic_viewer_data
->store_m
;
442 if(tscs
->stats
== NULL
) return;
444 lttv_attribute_write_xml(tscs
->stats
, stdout
, 1, 4);
447 ts
= tscs
->parent
.parent
.ts
;
448 nb
= lttv_traceset_number(ts
);
451 gtk_tree_store_append (store
, &iter
, NULL
);
452 gtk_tree_store_set (store
, &iter
,
453 NAME_COLUMN
, "Traceset statistics",
455 path
= gtk_tree_model_get_path(GTK_TREE_MODEL(store
), &iter
);
456 str
= gtk_tree_path_to_string (path
);
458 for(i
= 0 ; i
< nb
; i
++) {
459 if (LTTV_TRACESET_CONTEXT(tscs
)->traces
[i
]->t
->is_live
) {
460 statistic_viewer_data
->live_trace_count
++;
464 if (statistic_viewer_data
->live_trace_count
) {
465 LttvAttributeValue value
;
466 value
= lttv_attribute_add(tscs
->stats
,
467 g_quark_from_static_string("WARNING: Live traceset"),
469 /* TODO ybrosseau 2012-03-15: add cast to silent discard const
470 warning... find a better way */
471 *(value
.v_string
) = (char *)live_msg
;
474 g_hash_table_insert(statistic_viewer_data
->statistic_hash
,
475 (gpointer
)str
, tscs
->stats
);
476 show_tree(statistic_viewer_data
, tscs
->stats
, &iter
);
478 //show stats for all traces
479 for(i
= 0 ; i
< nb
; i
++) {
480 tcs
= (LttvTraceStats
*)(LTTV_TRACESET_CONTEXT(tscs
)->traces
[i
]);
482 desc
= ltt_trace_system_description(tcs
->parent
.parent
.t
);
483 LttTime start_time
= ltt_trace_system_description_trace_start_time(desc
);
484 sprintf(trace_str
, "Trace on system %s at time %lu.%09lu",
485 ltt_trace_system_description_node_name(desc
),
489 sprintf(trace_str
, "%s", g_quark_to_string(ltt_trace_name(tcs
->parent
.parent
.t
)));
490 /* TODO ybrosseau 2011-01-12: Reenable stats for live trace */
491 if (LTTV_TRACE_CONTEXT(tcs
)->t
->is_live
) {
492 strcat(trace_str
, " [LIVE]");
493 gtk_tree_store_append (store
, &iter
, NULL
);
494 gtk_tree_store_set (store
, &iter
,NAME_COLUMN
,trace_str
,-1);
496 path
= gtk_tree_model_get_path(GTK_TREE_MODEL(store
), &iter
);
497 str
= gtk_tree_path_to_string (path
);
498 g_hash_table_insert(statistic_viewer_data
->statistic_hash
,
503 gtk_tree_store_append (store
, &iter
, NULL
);
504 gtk_tree_store_set (store
, &iter
,NAME_COLUMN
,trace_str
,-1);
505 path
= gtk_tree_model_get_path(GTK_TREE_MODEL(store
), &iter
);
506 str
= gtk_tree_path_to_string (path
);
507 g_hash_table_insert(statistic_viewer_data
->statistic_hash
,
508 (gpointer
)str
,tcs
->stats
);
509 show_tree(statistic_viewer_data
, tcs
->stats
, &iter
);
511 lttv_attribute_write_xml(tcs
->stats
, stdout
, 3, 4);
517 void show_tree(StatisticViewerData
* statistic_viewer_data
,
518 LttvAttribute
* stats
, GtkTreeIter
* parent
)
521 LttvAttribute
*subtree
;
522 LttvAttributeName name
;
523 LttvAttributeValue value
;
524 LttvAttributeType type
;
526 gchar
* str
, dir_str
[PATH_LENGTH
];
529 GtkTreeStore
* store
= statistic_viewer_data
->store_m
;
531 nb
= lttv_attribute_get_number(stats
);
532 for(i
= 0 ; i
< nb
; i
++) {
533 type
= lttv_attribute_get(stats
, i
, &name
, &value
, &is_named
);
536 if(LTTV_IS_ATTRIBUTE(*(value
.v_gobject
))) {
537 subtree
= (LttvAttribute
*)*(value
.v_gobject
);
539 sprintf(dir_str
, "%s", g_quark_to_string(name
));
541 sprintf(dir_str
, "%u", name
);
542 gtk_tree_store_append (store
, &iter
, parent
);
543 gtk_tree_store_set (store
, &iter
,NAME_COLUMN
,dir_str
,-1);
544 path
= gtk_tree_model_get_path(GTK_TREE_MODEL(store
), &iter
);
545 str
= gtk_tree_path_to_string (path
);
546 g_hash_table_insert(statistic_viewer_data
->statistic_hash
,
547 (gpointer
)str
, subtree
);
548 show_tree(statistic_viewer_data
, subtree
, &iter
);
557 void show_statistic(StatisticViewerData
* statistic_viewer_data
,
558 LttvAttribute
* stats
, GtkTextBuffer
* buf
)
561 LttvAttributeName name
;
562 LttvAttributeValue value
;
563 LttvAttributeType type
;
565 gchar type_name
[PATH_LENGTH
], type_value
[PATH_LENGTH
];
566 GtkTextIter text_iter
;
570 nb
= lttv_attribute_get_number(stats
);
572 for(i
= 0 ; i
< nb
; i
++) {
573 type
= lttv_attribute_get(stats
, i
, &name
, &value
, &is_named
);
575 sprintf(type_name
,"%s", g_quark_to_string(name
));
577 sprintf(type_name
,"%u", name
);
578 type_value
[0] = '\0';
581 sprintf(type_value
, " : %d\n", *value
.v_int
);
584 sprintf(type_value
, " : %u\n", *value
.v_uint
);
587 sprintf(type_value
, " : %ld\n", *value
.v_long
);
590 sprintf(type_value
, " : %lu\n", *value
.v_ulong
);
593 sprintf(type_value
, " : %f\n", (double)*value
.v_float
);
596 sprintf(type_value
, " : %f\n", *value
.v_double
);
599 sprintf(type_value
, " : %10lu.%09lu\n", value
.v_time
->tv_sec
,
600 value
.v_time
->tv_nsec
);
603 sprintf(type_value
, " : POINTER\n");
606 sprintf(type_value
, " : %s\n", *value
.v_string
);
611 if(strlen(type_value
)){
613 strcat(type_name
,type_value
);
614 gtk_text_buffer_get_end_iter(buf
, &text_iter
);
615 gtk_text_buffer_insert(buf
, &text_iter
, type_name
, strlen(type_name
));
620 sprintf(type_value
, "No statistic information in this directory.\nCheck in subdirectories please.\n");
621 gtk_text_buffer_get_end_iter(buf
, &text_iter
);
622 gtk_text_buffer_insert(buf
, &text_iter
, type_value
, strlen(type_value
));
627 gboolean
statistic_traceset_changed(void * hook_data
, void * call_data
)
629 StatisticViewerData
*statistic_viewer_data
= (StatisticViewerData
*) hook_data
;
631 request_background_data(statistic_viewer_data
);
637 void statistic_add_context_hooks(StatisticViewerData
* statistic_viewer_data
,
638 LttvTracesetContext
* tsc
)
640 gint i
, j
, nbi
, nb_tracefile
;
642 LttvTraceContext
*tc
;
643 LttvTracefileContext
*tfc
;
644 LttvTracesetSelector
* ts_s
;
645 LttvTraceSelector
* t_s
;
646 LttvTracefileSelector
* tf_s
;
649 ts_s
= (LttvTracesetSelector
*)g_object_get_data(G_OBJECT(statistic_viewer_data
->hpaned_v
),
650 statistic_viewer_data
->filter_key
);
652 //if there are hooks for traceset, add them here
654 nbi
= lttv_traceset_number(tsc
->ts
);
655 for(i
= 0 ; i
< nbi
; i
++) {
656 t_s
= lttv_traceset_selector_trace_get(ts_s
,i
);
657 selected
= lttv_trace_selector_get_selected(t_s
);
658 if(!selected
) continue;
661 //if there are hooks for trace, add them here
663 nb_tracefile
= ltt_trace_control_tracefile_number(trace
) +
664 ltt_trace_per_cpu_tracefile_number(trace
);
666 for(j
= 0 ; j
< nb_tracefile
; j
++) {
667 tf_s
= lttv_trace_selector_tracefile_get(t_s
,j
);
668 selected
= lttv_tracefile_selector_get_selected(tf_s
);
669 if(!selected
) continue;
670 tfc
= tc
->tracefiles
[j
];
672 //if there are hooks for tracefile, add them here
673 // lttv_tracefile_context_add_hooks(tfc, NULL,NULL,NULL,NULL,
674 // statistic_viewer_data->before_event_hooks,NULL);
678 lttv_stats_add_event_hooks(LTTV_TRACESET_STATS(tsc
));
682 void statistic_remove_context_hooks(StatisticViewerData
* statistic_viewer_data
,
683 LttvTracesetContext
* tsc
)
685 gint i
, j
, nbi
, nb_tracefile
;
687 LttvTraceContext
*tc
;
688 LttvTracefileContext
*tfc
;
689 LttvTracesetSelector
* ts_s
;
690 LttvTraceSelector
* t_s
;
691 LttvTracefileSelector
* tf_s
;
694 ts_s
= (LttvTracesetSelector
*)g_object_get_data(G_OBJECT(statistic_viewer_data
->hpaned_v
),
695 statistic_viewer_data
->filter_key
);
697 //if there are hooks for traceset, remove them here
699 nbi
= lttv_traceset_number(tsc
->ts
);
700 for(i
= 0 ; i
< nbi
; i
++) {
701 t_s
= lttv_traceset_selector_trace_get(ts_s
,i
);
702 selected
= lttv_trace_selector_get_selected(t_s
);
703 if(!selected
) continue;
706 //if there are hooks for trace, remove them here
708 nb_tracefile
= ltt_trace_control_tracefile_number(trace
) +
709 ltt_trace_per_cpu_tracefile_number(trace
);
711 for(j
= 0 ; j
< nb_tracefile
; j
++) {
712 tf_s
= lttv_trace_selector_tracefile_get(t_s
,j
);
713 selected
= lttv_tracefile_selector_get_selected(tf_s
);
714 if(!selected
) continue;
715 tfc
= tc
->tracefiles
[j
];
717 //if there are hooks for tracefile, remove them here
718 // lttv_tracefile_context_remove_hooks(tfc, NULL,NULL,NULL,NULL,
719 // statistic_viewer_data->before_event_hooks,NULL);
723 lttv_stats_remove_event_hooks(LTTV_TRACESET_STATS(tsc
));
728 * plugin's init function
730 * This function initializes the Statistic Viewer functionnality through the
735 lttvwindow_register_constructor("guistatistics",
737 "Insert Statistic Viewer",
738 hGuiStatisticInsert_xpm
,
739 "Insert Statistic Viewer",
743 void statistic_destroy_walk(gpointer data
, gpointer user_data
)
745 StatisticViewerData
*svd
= (StatisticViewerData
*)data
;
747 g_debug("CFV.c : statistic_destroy_walk, %p", svd
);
748 /* May already have been done by GTK window closing */
749 if(GTK_IS_WIDGET(guistatistic_get_widget(svd
)))
750 gtk_widget_destroy(guistatistic_get_widget(svd
));
754 * plugin's destroy function
756 * This function releases the memory reserved by the module and unregisters
757 * everything that has been registered in the gtkTraceSet API.
759 static void destroy() {
761 g_slist_foreach(g_statistic_viewer_data_list
, statistic_destroy_walk
, NULL
);
762 g_slist_free(g_statistic_viewer_data_list
);
764 lttvwindow_unregister_constructor(h_gui_statistic
);
769 LTTV_MODULE("guistatistics", "Statistics viewer", \
770 "Graphical module to view statistics about processes, CPUs and systems", \
771 init
, destroy
, "lttvwindow")