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,
23 #include <lttv/lttv.h>
24 #include <lttv/module.h>
25 #include <lttvwindow/viewer.h>
26 #include <lttv/tracecontext.h>
27 #include <lttv/hook.h>
28 #include <lttvwindow/common.h>
29 #include <lttv/state.h>
30 #include <lttv/stats.h>
33 #include <ltt/event.h>
35 #include <ltt/trace.h>
39 #include "hGuiStatisticInsert.xpm"
41 #define PATH_LENGTH 256 /* CHECK */
43 static LttvModule
*statistic_main_win_module
;
44 static GPtrArray
* statistic_traceset
;
46 /** Array containing instanced objects. Used when module is unloaded */
47 static GSList
*g_statistic_viewer_data_list
= NULL
;
49 typedef struct _StatisticViewerData StatisticViewerData
;
51 //! Statistic Viewer's constructor hook
52 GtkWidget
*h_gui_statistic(MainWindow
*parent_window
, LttvTracesetSelector
* s
, char* key
);
53 //! Statistic Viewer's constructor
54 StatisticViewerData
*gui_statistic(MainWindow
*parent_window
,LttvTracesetSelector
* s
, char* key
);
55 //! Statistic Viewer's destructor
56 void gui_statistic_destructor(StatisticViewerData
*statistic_viewer_data
);
57 void gui_statistic_free(StatisticViewerData
*statistic_viewer_data
);
59 void grab_focus(GtkWidget
*widget
, gpointer data
);
60 static void tree_selection_changed_cb (GtkTreeSelection
*selection
, gpointer data
);
62 void statistic_destroy_hash_key(gpointer key
);
63 void statistic_destroy_hash_data(gpointer data
);
65 void show_traceset_stats(StatisticViewerData
* statistic_viewer_data
);
66 void show_tree(StatisticViewerData
* statistic_viewer_data
,
67 LttvAttribute
* stats
, GtkTreeIter
* parent
);
68 void show_statistic(StatisticViewerData
* statistic_viewer_data
,
69 LttvAttribute
* stats
, GtkTextBuffer
* buf
);
72 /** hook functions for update time interval, current time ... */
73 gboolean
statistic_update_time_window(void * hook_data
, void * call_data
);
74 gboolean
statistic_show_viewer(void * hook_data
, void * call_data
);
75 gboolean
statistic_traceset_changed(void * hook_data
, void * call_data
);
76 void statistic_add_context_hooks(StatisticViewerData
* statistic_viewer_data
,
77 LttvTracesetContext
* tsc
);
78 void statistic_remove_context_hooks(StatisticViewerData
* statistic_viewer_data
,
79 LttvTracesetContext
* tsc
);
81 gboolean
statistic_insert_traceset_stats(void * stats
);
89 struct _StatisticViewerData
{
91 LttvTracesetStats
* stats
;
92 gboolean calculate_stats
;
95 //TimeInterval time_span;
96 gboolean shown
; //indicate if the statistic is shown or not
100 GtkTreeStore
* store_m
;
103 //scroll window containing Tree View
104 GtkWidget
* scroll_win_tree
;
107 //scroll window containing Text View
108 GtkWidget
* scroll_win_text
;
111 GtkTreeSelection
*select_c
;
114 GHashTable
*statistic_hash
;
119 gui_statistic_free(StatisticViewerData
*statistic_viewer_data
)
121 if(statistic_viewer_data
){
122 lttvwindow_unregister_time_window_notify(statistic_viewer_data
->mw
,
123 statistic_update_time_window
,statistic_viewer_data
);
124 lttvwindow_unregister_show_notify(statistic_viewer_data
->mw
,
125 statistic_show_viewer
,statistic_viewer_data
);
126 lttvwindow_unregister_traceset_notify(statistic_viewer_data
->mw
,
127 statistic_traceset_changed
,statistic_viewer_data
);
129 g_hash_table_destroy(statistic_viewer_data
->statistic_hash
);
130 g_free(statistic_viewer_data
->filter_key
);
131 g_statistic_viewer_data_list
= g_slist_remove(g_statistic_viewer_data_list
, statistic_viewer_data
);
132 g_free(statistic_viewer_data
);
137 gui_statistic_destructor(StatisticViewerData
*statistic_viewer_data
)
139 /* May already been done by GTK window closing */
140 if(GTK_IS_WIDGET(statistic_viewer_data
->hpaned_v
)){
141 gui_statistic_free(statistic_viewer_data
);
142 gtk_widget_destroy(statistic_viewer_data
->hpaned_v
);
143 statistic_viewer_data
= NULL
;
145 //gui_statistic_free(statistic_viewer_data);
150 * Statistic Viewer's constructor hook
152 * This constructor is given as a parameter to the menuitem and toolbar button
153 * registration. It creates the list.
154 * @param parent_window A pointer to the parent window.
155 * @return The widget created.
158 h_gui_statistic(MainWindow
* parent_window
, LttvTracesetSelector
* s
, char* key
)
160 StatisticViewerData
* statistic_viewer_data
= gui_statistic(parent_window
, s
, key
) ;
162 if(statistic_viewer_data
)
163 return statistic_viewer_data
->hpaned_v
;
168 gboolean
statistic_insert_traceset_stats(void * stats
)
173 len
= statistic_traceset
->len
;
175 s
= g_ptr_array_index(statistic_traceset
, i
);
176 if(s
== stats
) break;
179 g_ptr_array_add(statistic_traceset
, stats
);
186 * Statistic Viewer's constructor
188 * This constructor is used to create StatisticViewerData data structure.
189 * @return The Statistic viewer data created.
191 StatisticViewerData
*
192 gui_statistic(MainWindow
*parent_window
, LttvTracesetSelector
* s
, char* key
)
194 GtkCellRenderer
*renderer
;
195 GtkTreeViewColumn
*column
;
197 StatisticViewerData
* statistic_viewer_data
= g_new(StatisticViewerData
,1);
199 statistic_viewer_data
->mw
= parent_window
;
200 statistic_viewer_data
->stats
=
201 lttvwindow_get_traceset_stats(statistic_viewer_data
->mw
);
202 statistic_viewer_data
->calculate_stats
= statistic_insert_traceset_stats((void *)statistic_viewer_data
->stats
);
204 lttvwindow_register_time_window_notify(statistic_viewer_data
->mw
,
205 statistic_update_time_window
,statistic_viewer_data
);
206 lttvwindow_register_show_notify(statistic_viewer_data
->mw
,
207 statistic_show_viewer
,statistic_viewer_data
);
208 lttvwindow_register_traceset_notify(statistic_viewer_data
->mw
,
209 statistic_traceset_changed
,statistic_viewer_data
);
211 statistic_viewer_data
->statistic_hash
= g_hash_table_new_full(g_str_hash
,
213 statistic_destroy_hash_key
,
214 statistic_destroy_hash_data
);
216 statistic_viewer_data
->hpaned_v
= gtk_hpaned_new();
217 statistic_viewer_data
->store_m
= gtk_tree_store_new (N_COLUMNS
, G_TYPE_STRING
);
218 statistic_viewer_data
->tree_v
=
219 gtk_tree_view_new_with_model (
220 GTK_TREE_MODEL (statistic_viewer_data
->store_m
));
221 g_object_unref (G_OBJECT (statistic_viewer_data
->store_m
));
223 g_signal_connect (G_OBJECT (statistic_viewer_data
->tree_v
), "grab-focus",
224 G_CALLBACK (grab_focus
),
225 statistic_viewer_data
);
227 // Setup the selection handler
228 statistic_viewer_data
->select_c
= gtk_tree_view_get_selection (GTK_TREE_VIEW (statistic_viewer_data
->tree_v
));
229 gtk_tree_selection_set_mode (statistic_viewer_data
->select_c
, GTK_SELECTION_SINGLE
);
230 g_signal_connect (G_OBJECT (statistic_viewer_data
->select_c
), "changed",
231 G_CALLBACK (tree_selection_changed_cb
),
232 statistic_viewer_data
);
234 renderer
= gtk_cell_renderer_text_new ();
235 column
= gtk_tree_view_column_new_with_attributes ("Statistic Name",
239 gtk_tree_view_column_set_alignment (column
, 0.0);
240 // gtk_tree_view_column_set_fixed_width (column, 45);
241 gtk_tree_view_append_column (GTK_TREE_VIEW (statistic_viewer_data
->tree_v
), column
);
244 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (statistic_viewer_data
->tree_v
), FALSE
);
246 statistic_viewer_data
->scroll_win_tree
= gtk_scrolled_window_new (NULL
, NULL
);
247 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(statistic_viewer_data
->scroll_win_tree
),
248 GTK_POLICY_AUTOMATIC
,GTK_POLICY_AUTOMATIC
);
250 gtk_container_add (GTK_CONTAINER (statistic_viewer_data
->scroll_win_tree
), statistic_viewer_data
->tree_v
);
251 gtk_paned_pack1(GTK_PANED(statistic_viewer_data
->hpaned_v
),statistic_viewer_data
->scroll_win_tree
, TRUE
, FALSE
);
252 gtk_paned_set_position(GTK_PANED(statistic_viewer_data
->hpaned_v
), 160);
254 statistic_viewer_data
->scroll_win_text
= gtk_scrolled_window_new (NULL
, NULL
);
255 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(statistic_viewer_data
->scroll_win_text
),
256 GTK_POLICY_AUTOMATIC
,GTK_POLICY_AUTOMATIC
);
258 statistic_viewer_data
->text_v
= gtk_text_view_new ();
259 g_signal_connect (G_OBJECT (statistic_viewer_data
->text_v
), "grab-focus",
260 G_CALLBACK (grab_focus
),
261 statistic_viewer_data
);
263 gtk_text_view_set_editable(GTK_TEXT_VIEW(statistic_viewer_data
->text_v
),FALSE
);
264 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(statistic_viewer_data
->text_v
),FALSE
);
265 gtk_container_add (GTK_CONTAINER (statistic_viewer_data
->scroll_win_text
), statistic_viewer_data
->text_v
);
266 gtk_paned_pack2(GTK_PANED(statistic_viewer_data
->hpaned_v
), statistic_viewer_data
->scroll_win_text
, TRUE
, FALSE
);
268 gtk_widget_show(statistic_viewer_data
->scroll_win_tree
);
269 gtk_widget_show(statistic_viewer_data
->scroll_win_text
);
270 gtk_widget_show(statistic_viewer_data
->tree_v
);
271 gtk_widget_show(statistic_viewer_data
->text_v
);
272 gtk_widget_show(statistic_viewer_data
->hpaned_v
);
274 statistic_viewer_data
->shown
= FALSE
;
275 statistic_viewer_data
->filter_key
= g_strdup(key
);
277 G_OBJECT(statistic_viewer_data
->hpaned_v
),
278 statistic_viewer_data
->filter_key
,
282 G_OBJECT(statistic_viewer_data->hpaned_v),
284 &statistic_viewer_data->time_span);
287 if(statistic_viewer_data
->calculate_stats
){
288 //if(lttv_stats_load_statistics(statistic_viewer_data->stats))
289 // statistic_viewer_data->calculate_stats = FALSE;
292 if(statistic_viewer_data
->calculate_stats
== FALSE
){
293 statistic_viewer_data
->size
= 1;
295 G_OBJECT(statistic_viewer_data
->hpaned_v
),
297 &statistic_viewer_data
->size
);
300 g_object_set_data_full(
301 G_OBJECT(statistic_viewer_data
->hpaned_v
),
302 "statistic_viewer_data",
303 statistic_viewer_data
,
304 (GDestroyNotify
)gui_statistic_free
);
306 /* Add the object's information to the module's array */
307 g_statistic_viewer_data_list
= g_slist_append(
308 g_statistic_viewer_data_list
,
309 statistic_viewer_data
);
311 return statistic_viewer_data
;
314 void grab_focus(GtkWidget
*widget
, gpointer data
)
316 StatisticViewerData
*statistic_viewer_data
= (StatisticViewerData
*)data
;
317 MainWindow
* mw
= statistic_viewer_data
->mw
;
318 lttvwindow_report_focus(mw
, gtk_widget_get_parent(statistic_viewer_data
->hpaned_v
));
322 tree_selection_changed_cb (GtkTreeSelection
*selection
, gpointer data
)
324 StatisticViewerData
*statistic_viewer_data
= (StatisticViewerData
*)data
;
326 GtkTreeModel
*model
= GTK_TREE_MODEL(statistic_viewer_data
->store_m
);
331 GtkTextIter text_iter
;
332 LttvAttribute
* stats
;
334 if (gtk_tree_selection_get_selected (selection
, &model
, &iter
))
336 gtk_tree_model_get (model
, &iter
, NAME_COLUMN
, &event
, -1);
338 path
= gtk_tree_model_get_path(GTK_TREE_MODEL(model
),&iter
);
339 str
= gtk_tree_path_to_string (path
);
340 stats
= (LttvAttribute
*)g_hash_table_lookup (statistic_viewer_data
->statistic_hash
,str
);
343 buf
= gtk_text_view_get_buffer((GtkTextView
*)statistic_viewer_data
->text_v
);
344 gtk_text_buffer_set_text(buf
,"Statistic for '", -1);
345 gtk_text_buffer_get_end_iter(buf
, &text_iter
);
346 gtk_text_buffer_insert(buf
, &text_iter
, event
, strlen(event
));
347 gtk_text_buffer_get_end_iter(buf
, &text_iter
);
348 gtk_text_buffer_insert(buf
, &text_iter
, "' :\n\n",5);
350 show_statistic(statistic_viewer_data
, stats
, buf
);
356 void statistic_destroy_hash_key(gpointer key
)
361 void statistic_destroy_hash_data(gpointer data
)
366 void show_traceset_stats(StatisticViewerData
* statistic_viewer_data
)
371 LttSystemDescription
*desc
;
372 LttvTracesetStats
* tscs
= statistic_viewer_data
->stats
;
373 gchar
* str
, trace_str
[PATH_LENGTH
];
376 GtkTreeStore
* store
= statistic_viewer_data
->store_m
;
378 if(tscs
->stats
== NULL
) return;
380 ts
= tscs
->parent
.parent
.ts
;
381 nb
= lttv_traceset_number(ts
);
384 gtk_tree_store_append (store
, &iter
, NULL
);
385 gtk_tree_store_set (store
, &iter
,
386 NAME_COLUMN
, "Traceset statistics",
388 path
= gtk_tree_model_get_path(GTK_TREE_MODEL(store
), &iter
);
389 str
= gtk_tree_path_to_string (path
);
390 g_hash_table_insert(statistic_viewer_data
->statistic_hash
,
391 (gpointer
)str
, tscs
->stats
);
392 show_tree(statistic_viewer_data
, tscs
->stats
, &iter
);
394 //show stats for all traces
395 for(i
= 0 ; i
< nb
; i
++) {
396 tcs
= (LttvTraceStats
*)(LTTV_TRACESET_CONTEXT(tscs
)->traces
[i
]);
397 desc
= ltt_trace_system_description(tcs
->parent
.parent
.t
);
398 sprintf(trace_str
, "Trace on system %s at time %d secs",
399 ltt_trace_system_description_node_name(desc
),
400 (ltt_trace_system_description_trace_start_time(desc
)).tv_sec
);
402 gtk_tree_store_append (store
, &iter
, NULL
);
403 gtk_tree_store_set (store
, &iter
,NAME_COLUMN
,trace_str
,-1);
404 path
= gtk_tree_model_get_path(GTK_TREE_MODEL(store
), &iter
);
405 str
= gtk_tree_path_to_string (path
);
406 g_hash_table_insert(statistic_viewer_data
->statistic_hash
,
407 (gpointer
)str
,tcs
->stats
);
408 show_tree(statistic_viewer_data
, tcs
->stats
, &iter
);
412 void show_tree(StatisticViewerData
* statistic_viewer_data
,
413 LttvAttribute
* stats
, GtkTreeIter
* parent
)
416 LttvAttribute
*subtree
;
417 LttvAttributeName name
;
418 LttvAttributeValue value
;
419 LttvAttributeType type
;
420 gchar
* str
, dir_str
[PATH_LENGTH
];
423 GtkTreeStore
* store
= statistic_viewer_data
->store_m
;
425 nb
= lttv_attribute_get_number(stats
);
426 for(i
= 0 ; i
< nb
; i
++) {
427 type
= lttv_attribute_get(stats
, i
, &name
, &value
);
430 if(LTTV_IS_ATTRIBUTE(*(value
.v_gobject
))) {
431 sprintf(dir_str
, "%s", g_quark_to_string(name
));
432 subtree
= (LttvAttribute
*)*(value
.v_gobject
);
433 gtk_tree_store_append (store
, &iter
, parent
);
434 gtk_tree_store_set (store
, &iter
,NAME_COLUMN
,dir_str
,-1);
435 path
= gtk_tree_model_get_path(GTK_TREE_MODEL(store
), &iter
);
436 str
= gtk_tree_path_to_string (path
);
437 g_hash_table_insert(statistic_viewer_data
->statistic_hash
,
438 (gpointer
)str
, subtree
);
439 show_tree(statistic_viewer_data
, subtree
, &iter
);
448 void show_statistic(StatisticViewerData
* statistic_viewer_data
,
449 LttvAttribute
* stats
, GtkTextBuffer
* buf
)
452 LttvAttribute
*subtree
;
453 LttvAttributeName name
;
454 LttvAttributeValue value
;
455 LttvAttributeType type
;
456 gchar type_name
[PATH_LENGTH
], type_value
[PATH_LENGTH
];
457 GtkTextIter text_iter
;
460 nb
= lttv_attribute_get_number(stats
);
461 for(i
= 0 ; i
< nb
; i
++) {
462 type
= lttv_attribute_get(stats
, i
, &name
, &value
);
463 sprintf(type_name
,"%s", g_quark_to_string(name
));
464 type_value
[0] = '\0';
467 sprintf(type_value
, " : %d\n", *value
.v_int
);
470 sprintf(type_value
, " : %u\n", *value
.v_uint
);
473 sprintf(type_value
, " : %ld\n", *value
.v_long
);
476 sprintf(type_value
, " : %lu\n", *value
.v_ulong
);
479 sprintf(type_value
, " : %f\n", (double)*value
.v_float
);
482 sprintf(type_value
, " : %f\n", *value
.v_double
);
485 sprintf(type_value
, " : %10u.%09u\n", value
.v_time
->tv_sec
,
486 value
.v_time
->tv_nsec
);
489 sprintf(type_value
, " : POINTER\n");
492 sprintf(type_value
, " : %s\n", *value
.v_string
);
497 if(strlen(type_value
)){
499 strcat(type_name
,type_value
);
500 gtk_text_buffer_get_end_iter(buf
, &text_iter
);
501 gtk_text_buffer_insert(buf
, &text_iter
, type_name
, strlen(type_name
));
506 sprintf(type_value
, "No statistic information in this directory.\nCheck in subdirectories please.\n");
507 gtk_text_buffer_get_end_iter(buf
, &text_iter
);
508 gtk_text_buffer_insert(buf
, &text_iter
, type_value
, strlen(type_value
));
513 gboolean
statistic_update_time_window(void * hook_data
, void * call_data
)
515 StatisticViewerData
*statistic_viewer_data
= (StatisticViewerData
*) hook_data
;
516 LttvTracesetContext
* tsc
=
517 lttvwindow_get_traceset_context(statistic_viewer_data
->mw
);
519 //if statistic is already calculated, do nothing
520 if(!statistic_viewer_data
->calculate_stats
){
524 if(statistic_viewer_data
->shown
== FALSE
){
525 statistic_add_context_hooks(statistic_viewer_data
, tsc
);
530 gboolean
statistic_show_viewer(void * hook_data
, void * call_data
)
532 StatisticViewerData
*statistic_viewer_data
= (StatisticViewerData
*) hook_data
;
533 LttvTracesetContext
* tsc
=
534 lttvwindow_get_traceset_context(statistic_viewer_data
->mw
);
536 if(statistic_viewer_data
->shown
== FALSE
){
537 statistic_viewer_data
->shown
= TRUE
;
538 show_traceset_stats(statistic_viewer_data
);
539 if(statistic_viewer_data
->calculate_stats
){
540 statistic_remove_context_hooks(statistic_viewer_data
,tsc
);
541 //lttv_stats_save_statistics((LttvTracesetStats*)tsc);
548 gboolean
statistic_traceset_changed(void * hook_data
, void * call_data
)
550 StatisticViewerData
*statistic_viewer_data
= (StatisticViewerData
*) hook_data
;
552 gtk_tree_store_clear (statistic_viewer_data
->store_m
);
553 statistic_viewer_data
->shown
= FALSE
;
558 void statistic_add_context_hooks(StatisticViewerData
* statistic_viewer_data
,
559 LttvTracesetContext
* tsc
)
561 gint i
, j
, nbi
, nb_tracefile
;
563 LttvTraceContext
*tc
;
564 LttvTracefileContext
*tfc
;
565 LttvTracesetSelector
* ts_s
;
566 LttvTraceSelector
* t_s
;
567 LttvTracefileSelector
* tf_s
;
570 ts_s
= (LttvTracesetSelector
*)g_object_get_data(G_OBJECT(statistic_viewer_data
->hpaned_v
),
571 statistic_viewer_data
->filter_key
);
573 //if there are hooks for traceset, add them here
575 nbi
= lttv_traceset_number(tsc
->ts
);
576 for(i
= 0 ; i
< nbi
; i
++) {
577 t_s
= lttv_traceset_selector_trace_get(ts_s
,i
);
578 selected
= lttv_trace_selector_get_selected(t_s
);
579 if(!selected
) continue;
582 //if there are hooks for trace, add them here
584 nb_tracefile
= ltt_trace_control_tracefile_number(trace
) +
585 ltt_trace_per_cpu_tracefile_number(trace
);
587 for(j
= 0 ; j
< nb_tracefile
; j
++) {
588 tf_s
= lttv_trace_selector_tracefile_get(t_s
,j
);
589 selected
= lttv_tracefile_selector_get_selected(tf_s
);
590 if(!selected
) continue;
591 tfc
= tc
->tracefiles
[j
];
593 //if there are hooks for tracefile, add them here
594 // lttv_tracefile_context_add_hooks(tfc, NULL,NULL,NULL,NULL,
595 // statistic_viewer_data->before_event_hooks,NULL);
599 lttv_stats_add_event_hooks(LTTV_TRACESET_STATS(tsc
));
603 void statistic_remove_context_hooks(StatisticViewerData
* statistic_viewer_data
,
604 LttvTracesetContext
* tsc
)
606 gint i
, j
, nbi
, nb_tracefile
;
608 LttvTraceContext
*tc
;
609 LttvTracefileContext
*tfc
;
610 LttvTracesetSelector
* ts_s
;
611 LttvTraceSelector
* t_s
;
612 LttvTracefileSelector
* tf_s
;
615 ts_s
= (LttvTracesetSelector
*)g_object_get_data(G_OBJECT(statistic_viewer_data
->hpaned_v
),
616 statistic_viewer_data
->filter_key
);
618 //if there are hooks for traceset, remove them here
620 nbi
= lttv_traceset_number(tsc
->ts
);
621 for(i
= 0 ; i
< nbi
; i
++) {
622 t_s
= lttv_traceset_selector_trace_get(ts_s
,i
);
623 selected
= lttv_trace_selector_get_selected(t_s
);
624 if(!selected
) continue;
627 //if there are hooks for trace, remove them here
629 nb_tracefile
= ltt_trace_control_tracefile_number(trace
) +
630 ltt_trace_per_cpu_tracefile_number(trace
);
632 for(j
= 0 ; j
< nb_tracefile
; j
++) {
633 tf_s
= lttv_trace_selector_tracefile_get(t_s
,j
);
634 selected
= lttv_tracefile_selector_get_selected(tf_s
);
635 if(!selected
) continue;
636 tfc
= tc
->tracefiles
[j
];
638 //if there are hooks for tracefile, remove them here
639 // lttv_tracefile_context_remove_hooks(tfc, NULL,NULL,NULL,NULL,
640 // statistic_viewer_data->before_event_hooks,NULL);
644 lttv_stats_remove_event_hooks(LTTV_TRACESET_STATS(tsc
));
649 * plugin's init function
651 * This function initializes the Statistic Viewer functionnality through the
656 statistic_traceset
= g_ptr_array_new ();
658 /* Register the toolbar insert button */
659 lttvwindow_register_toolbar(hGuiStatisticInsert_xpm
, "Insert Statistic Viewer", h_gui_statistic
);
661 /* Register the menu item insert entry */
662 lttvwindow_register_menu("/", "Insert Statistic Viewer", h_gui_statistic
);
666 void statistic_destroy_walk(gpointer data
, gpointer user_data
)
668 gui_statistic_destructor((StatisticViewerData
*)data
);
672 * plugin's destroy function
674 * This function releases the memory reserved by the module and unregisters
675 * everything that has been registered in the gtkTraceSet API.
677 static void destroy() {
680 if(g_statistic_viewer_data_list
){
681 g_slist_foreach(g_statistic_viewer_data_list
, statistic_destroy_walk
, NULL
);
682 g_slist_free(g_statistic_viewer_data_list
);
684 g_ptr_array_free (statistic_traceset
, TRUE
);
686 /* Unregister the toolbar insert button */
687 lttvwindow_unregister_toolbar(h_gui_statistic
);
689 /* Unregister the menu item insert entry */
690 lttvwindow_unregister_menu(h_gui_statistic
);
694 LTTV_MODULE("guistatistics", "Statistics viewer", \
695 "Graphical module to view statistics about processes, CPUs and systems", \
696 init
, destroy
, "lttvwindow")