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,
24 #include <lttv/module.h>
25 #include <lttv/gtkTraceSet.h>
26 #include <lttv/processTrace.h>
27 #include <lttv/hook.h>
28 #include <lttv/common.h>
29 #include <lttv/state.h>
30 #include <lttv/stats.h>
33 #include <ltt/event.h>
35 #include <ltt/trace.h>
39 #include "../icons/hGuiStatisticInsert.xpm"
41 #define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format)
42 #define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format)
44 #define PATH_LENGTH 256
46 static LttvModule
*statistic_main_win_module
;
47 static GPtrArray
* statistic_traceset
;
49 /** Array containing instanced objects. Used when module is unloaded */
50 static GSList
*g_statistic_viewer_data_list
= NULL
;
52 typedef struct _StatisticViewerData StatisticViewerData
;
54 //! Statistic Viewer's constructor hook
55 GtkWidget
*h_gui_statistic(MainWindow
*parent_window
, LttvTracesetSelector
* s
, char* key
);
56 //! Statistic Viewer's constructor
57 StatisticViewerData
*gui_statistic(MainWindow
*parent_window
,LttvTracesetSelector
* s
, char* key
);
58 //! Statistic Viewer's destructor
59 void gui_statistic_destructor(StatisticViewerData
*statistic_viewer_data
);
60 void gui_statistic_free(StatisticViewerData
*statistic_viewer_data
);
62 void grab_focus(GtkWidget
*widget
, gpointer data
);
63 static void tree_selection_changed_cb (GtkTreeSelection
*selection
, gpointer data
);
65 void statistic_destroy_hash_key(gpointer key
);
66 void statistic_destroy_hash_data(gpointer data
);
68 void show_traceset_stats(StatisticViewerData
* statistic_viewer_data
);
69 void show_tree(StatisticViewerData
* statistic_viewer_data
,
70 LttvAttribute
* stats
, GtkTreeIter
* parent
);
71 void show_statistic(StatisticViewerData
* statistic_viewer_data
,
72 LttvAttribute
* stats
, GtkTextBuffer
* buf
);
75 /** hook functions for update time interval, current time ... */
76 gboolean
statistic_update_time_window(void * hook_data
, void * call_data
);
77 gboolean
statistic_show_viewer(void * hook_data
, void * call_data
);
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
{
94 LttvTracesetStats
* stats
;
95 gboolean calculate_stats
;
98 TimeInterval time_span
;
99 gboolean shown
; //indicate if the statistic is shown or not
102 GtkWidget
* hpaned_v
;
103 GtkTreeStore
* store_m
;
106 //scroll window containing Tree View
107 GtkWidget
* scroll_win_tree
;
110 //scroll window containing Text View
111 GtkWidget
* scroll_win_text
;
114 GtkTreeSelection
*select_c
;
117 GHashTable
*statistic_hash
;
122 * plugin's init function
124 * This function initializes the Statistic Viewer functionnality through the
127 G_MODULE_EXPORT
void init(LttvModule
*self
, int argc
, char *argv
[]) {
129 statistic_main_win_module
= lttv_module_require(self
, "mainwin", argc
, argv
);
131 if(statistic_main_win_module
== NULL
){
132 g_critical("Can't load Statistic Viewer : missing mainwin\n");
136 statistic_traceset
= g_ptr_array_new ();
138 /* Register the toolbar insert button */
139 toolbar_item_reg(hGuiStatisticInsert_xpm
, "Insert Statistic Viewer", h_gui_statistic
);
141 /* Register the menu item insert entry */
142 menu_item_reg("/", "Insert Statistic Viewer", h_gui_statistic
);
146 void statistic_destroy_walk(gpointer data
, gpointer user_data
)
148 gui_statistic_destructor((StatisticViewerData
*)data
);
152 * plugin's destroy function
154 * This function releases the memory reserved by the module and unregisters
155 * everything that has been registered in the gtkTraceSet API.
157 G_MODULE_EXPORT
void destroy() {
160 if(g_statistic_viewer_data_list
){
161 g_slist_foreach(g_statistic_viewer_data_list
, statistic_destroy_walk
, NULL
);
162 g_slist_free(g_statistic_viewer_data_list
);
164 g_ptr_array_free (statistic_traceset
, TRUE
);
166 /* Unregister the toolbar insert button */
167 toolbar_item_unreg(h_gui_statistic
);
169 /* Unregister the menu item insert entry */
170 menu_item_unreg(h_gui_statistic
);
175 gui_statistic_free(StatisticViewerData
*statistic_viewer_data
)
177 if(statistic_viewer_data
){
178 unreg_update_time_window(statistic_update_time_window
,statistic_viewer_data
, statistic_viewer_data
->mw
);
179 unreg_show_viewer(statistic_show_viewer
,statistic_viewer_data
, statistic_viewer_data
->mw
);
180 unreg_update_traceset(statistic_traceset_changed
,statistic_viewer_data
, statistic_viewer_data
->mw
);
182 g_hash_table_destroy(statistic_viewer_data
->statistic_hash
);
183 g_free(statistic_viewer_data
->filter_key
);
184 g_statistic_viewer_data_list
= g_slist_remove(g_statistic_viewer_data_list
, statistic_viewer_data
);
185 g_free(statistic_viewer_data
);
190 gui_statistic_destructor(StatisticViewerData
*statistic_viewer_data
)
192 /* May already been done by GTK window closing */
193 if(GTK_IS_WIDGET(statistic_viewer_data
->hpaned_v
)){
194 gtk_widget_destroy(statistic_viewer_data
->hpaned_v
);
195 statistic_viewer_data
= NULL
;
197 //gui_statistic_free(statistic_viewer_data);
202 * Statistic Viewer's constructor hook
204 * This constructor is given as a parameter to the menuitem and toolbar button
205 * registration. It creates the list.
206 * @param parent_window A pointer to the parent window.
207 * @return The widget created.
210 h_gui_statistic(MainWindow
* parent_window
, LttvTracesetSelector
* s
, char* key
)
212 StatisticViewerData
* statistic_viewer_data
= gui_statistic(parent_window
, s
, key
) ;
214 if(statistic_viewer_data
)
215 return statistic_viewer_data
->hpaned_v
;
220 gboolean
statistic_insert_traceset_stats(void * stats
)
225 len
= statistic_traceset
->len
;
227 s
= g_ptr_array_index(statistic_traceset
, i
);
228 if(s
== stats
) break;
231 g_ptr_array_add(statistic_traceset
, stats
);
238 * Statistic Viewer's constructor
240 * This constructor is used to create StatisticViewerData data structure.
241 * @return The Statistic viewer data created.
243 StatisticViewerData
*
244 gui_statistic(MainWindow
*parent_window
, LttvTracesetSelector
* s
, char* key
)
246 GtkCellRenderer
*renderer
;
247 GtkTreeViewColumn
*column
;
249 StatisticViewerData
* statistic_viewer_data
= g_new(StatisticViewerData
,1);
251 statistic_viewer_data
->mw
= parent_window
;
252 statistic_viewer_data
->stats
= get_traceset_stats_api(statistic_viewer_data
->mw
);
253 statistic_viewer_data
->calculate_stats
= statistic_insert_traceset_stats((void *)statistic_viewer_data
->stats
);
255 reg_update_time_window(statistic_update_time_window
,statistic_viewer_data
, statistic_viewer_data
->mw
);
256 reg_show_viewer(statistic_show_viewer
,statistic_viewer_data
, statistic_viewer_data
->mw
);
257 reg_update_traceset(statistic_traceset_changed
,statistic_viewer_data
, statistic_viewer_data
->mw
);
259 statistic_viewer_data
->statistic_hash
= g_hash_table_new_full(g_str_hash
, g_str_equal
,
260 statistic_destroy_hash_key
,
261 statistic_destroy_hash_data
);
263 statistic_viewer_data
->hpaned_v
= gtk_hpaned_new();
264 statistic_viewer_data
->store_m
= gtk_tree_store_new (N_COLUMNS
, G_TYPE_STRING
);
265 statistic_viewer_data
->tree_v
= gtk_tree_view_new_with_model (GTK_TREE_MODEL (statistic_viewer_data
->store_m
));
266 g_object_unref (G_OBJECT (statistic_viewer_data
->store_m
));
268 g_signal_connect (G_OBJECT (statistic_viewer_data
->tree_v
), "grab-focus",
269 G_CALLBACK (grab_focus
),
270 statistic_viewer_data
);
272 // Setup the selection handler
273 statistic_viewer_data
->select_c
= gtk_tree_view_get_selection (GTK_TREE_VIEW (statistic_viewer_data
->tree_v
));
274 gtk_tree_selection_set_mode (statistic_viewer_data
->select_c
, GTK_SELECTION_SINGLE
);
275 g_signal_connect (G_OBJECT (statistic_viewer_data
->select_c
), "changed",
276 G_CALLBACK (tree_selection_changed_cb
),
277 statistic_viewer_data
);
279 renderer
= gtk_cell_renderer_text_new ();
280 column
= gtk_tree_view_column_new_with_attributes ("Statistic Name",
284 gtk_tree_view_column_set_alignment (column
, 0.0);
285 // gtk_tree_view_column_set_fixed_width (column, 45);
286 gtk_tree_view_append_column (GTK_TREE_VIEW (statistic_viewer_data
->tree_v
), column
);
289 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (statistic_viewer_data
->tree_v
), FALSE
);
291 statistic_viewer_data
->scroll_win_tree
= gtk_scrolled_window_new (NULL
, NULL
);
292 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(statistic_viewer_data
->scroll_win_tree
),
293 GTK_POLICY_AUTOMATIC
,GTK_POLICY_AUTOMATIC
);
295 gtk_container_add (GTK_CONTAINER (statistic_viewer_data
->scroll_win_tree
), statistic_viewer_data
->tree_v
);
296 gtk_paned_pack1(GTK_PANED(statistic_viewer_data
->hpaned_v
),statistic_viewer_data
->scroll_win_tree
, TRUE
, FALSE
);
297 gtk_paned_set_position(GTK_PANED(statistic_viewer_data
->hpaned_v
), 160);
299 statistic_viewer_data
->scroll_win_text
= gtk_scrolled_window_new (NULL
, NULL
);
300 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(statistic_viewer_data
->scroll_win_text
),
301 GTK_POLICY_AUTOMATIC
,GTK_POLICY_AUTOMATIC
);
303 statistic_viewer_data
->text_v
= gtk_text_view_new ();
304 g_signal_connect (G_OBJECT (statistic_viewer_data
->text_v
), "grab-focus",
305 G_CALLBACK (grab_focus
),
306 statistic_viewer_data
);
308 gtk_text_view_set_editable(GTK_TEXT_VIEW(statistic_viewer_data
->text_v
),FALSE
);
309 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(statistic_viewer_data
->text_v
),FALSE
);
310 gtk_container_add (GTK_CONTAINER (statistic_viewer_data
->scroll_win_text
), statistic_viewer_data
->text_v
);
311 gtk_paned_pack2(GTK_PANED(statistic_viewer_data
->hpaned_v
), statistic_viewer_data
->scroll_win_text
, TRUE
, FALSE
);
313 gtk_widget_show(statistic_viewer_data
->scroll_win_tree
);
314 gtk_widget_show(statistic_viewer_data
->scroll_win_text
);
315 gtk_widget_show(statistic_viewer_data
->tree_v
);
316 gtk_widget_show(statistic_viewer_data
->text_v
);
317 gtk_widget_show(statistic_viewer_data
->hpaned_v
);
319 //get the life span of the traceset and set the upper of the scroll bar
320 get_traceset_time_span(statistic_viewer_data
->mw
, &statistic_viewer_data
->time_span
);
322 statistic_viewer_data
->shown
= FALSE
;
323 statistic_viewer_data
->filter_key
= g_strdup(key
);
325 G_OBJECT(statistic_viewer_data
->hpaned_v
),
326 statistic_viewer_data
->filter_key
,
330 G_OBJECT(statistic_viewer_data
->hpaned_v
),
332 &statistic_viewer_data
->time_span
);
334 if(statistic_viewer_data
->calculate_stats
){
335 if(lttv_stats_load_statistics(statistic_viewer_data
->stats
))
336 statistic_viewer_data
->calculate_stats
= FALSE
;
339 if(statistic_viewer_data
->calculate_stats
== FALSE
){
340 statistic_viewer_data
->size
= 1;
342 G_OBJECT(statistic_viewer_data
->hpaned_v
),
344 &statistic_viewer_data
->size
);
347 g_object_set_data_full(
348 G_OBJECT(statistic_viewer_data
->hpaned_v
),
349 "statistic_viewer_data",
350 statistic_viewer_data
,
351 (GDestroyNotify
)gui_statistic_free
);
353 /* Add the object's information to the module's array */
354 g_statistic_viewer_data_list
= g_slist_append(
355 g_statistic_viewer_data_list
,
356 statistic_viewer_data
);
358 return statistic_viewer_data
;
361 void grab_focus(GtkWidget
*widget
, gpointer data
)
363 StatisticViewerData
*statistic_viewer_data
= (StatisticViewerData
*)data
;
364 MainWindow
* mw
= statistic_viewer_data
->mw
;
365 set_focused_pane(mw
, gtk_widget_get_parent(statistic_viewer_data
->hpaned_v
));
369 tree_selection_changed_cb (GtkTreeSelection
*selection
, gpointer data
)
371 StatisticViewerData
*statistic_viewer_data
= (StatisticViewerData
*)data
;
373 GtkTreeModel
*model
= GTK_TREE_MODEL(statistic_viewer_data
->store_m
);
378 GtkTextIter text_iter
;
379 LttvAttribute
* stats
;
381 if (gtk_tree_selection_get_selected (selection
, &model
, &iter
))
383 gtk_tree_model_get (model
, &iter
, NAME_COLUMN
, &event
, -1);
385 path
= gtk_tree_model_get_path(GTK_TREE_MODEL(model
),&iter
);
386 str
= gtk_tree_path_to_string (path
);
387 stats
= (LttvAttribute
*)g_hash_table_lookup (statistic_viewer_data
->statistic_hash
,str
);
390 buf
= gtk_text_view_get_buffer((GtkTextView
*)statistic_viewer_data
->text_v
);
391 gtk_text_buffer_set_text(buf
,"Statistic for '", -1);
392 gtk_text_buffer_get_end_iter(buf
, &text_iter
);
393 gtk_text_buffer_insert(buf
, &text_iter
, event
, strlen(event
));
394 gtk_text_buffer_get_end_iter(buf
, &text_iter
);
395 gtk_text_buffer_insert(buf
, &text_iter
, "' :\n\n",5);
397 show_statistic(statistic_viewer_data
, stats
, buf
);
403 void statistic_destroy_hash_key(gpointer key
)
408 void statistic_destroy_hash_data(gpointer data
)
413 void show_traceset_stats(StatisticViewerData
* statistic_viewer_data
)
418 LttSystemDescription
*desc
;
419 LttvTracesetStats
* tscs
= statistic_viewer_data
->stats
;
420 gchar
* str
, trace_str
[PATH_LENGTH
];
423 GtkTreeStore
* store
= statistic_viewer_data
->store_m
;
425 if(tscs
->stats
== NULL
) return;
427 gtk_tree_store_append (store
, &iter
, NULL
);
428 gtk_tree_store_set (store
, &iter
,
429 NAME_COLUMN
, "Traceset statistics",
431 path
= gtk_tree_model_get_path(GTK_TREE_MODEL(store
), &iter
);
432 str
= gtk_tree_path_to_string (path
);
433 g_hash_table_insert(statistic_viewer_data
->statistic_hash
,
434 (gpointer
)str
, tscs
->stats
);
435 show_tree(statistic_viewer_data
, tscs
->stats
, &iter
);
437 //show stats for all traces
438 ts
= tscs
->parent
.parent
.ts
;
439 nb
= lttv_traceset_number(ts
);
441 for(i
= 0 ; i
< nb
; i
++) {
442 tcs
= (LttvTraceStats
*)(LTTV_TRACESET_CONTEXT(tscs
)->traces
[i
]);
443 desc
= ltt_trace_system_description(tcs
->parent
.parent
.t
);
444 sprintf(trace_str
, "Trace on system %s at time %d secs",
445 ltt_trace_system_description_node_name(desc
),
446 (ltt_trace_system_description_trace_start_time(desc
)).tv_sec
);
448 gtk_tree_store_append (store
, &iter
, NULL
);
449 gtk_tree_store_set (store
, &iter
,NAME_COLUMN
,trace_str
,-1);
450 path
= gtk_tree_model_get_path(GTK_TREE_MODEL(store
), &iter
);
451 str
= gtk_tree_path_to_string (path
);
452 g_hash_table_insert(statistic_viewer_data
->statistic_hash
,
453 (gpointer
)str
,tcs
->stats
);
454 show_tree(statistic_viewer_data
, tcs
->stats
, &iter
);
458 void show_tree(StatisticViewerData
* statistic_viewer_data
,
459 LttvAttribute
* stats
, GtkTreeIter
* parent
)
462 LttvAttribute
*subtree
;
463 LttvAttributeName name
;
464 LttvAttributeValue value
;
465 LttvAttributeType type
;
466 gchar
* str
, dir_str
[PATH_LENGTH
];
469 GtkTreeStore
* store
= statistic_viewer_data
->store_m
;
471 nb
= lttv_attribute_get_number(stats
);
472 for(i
= 0 ; i
< nb
; i
++) {
473 type
= lttv_attribute_get(stats
, i
, &name
, &value
);
476 if(LTTV_IS_ATTRIBUTE(*(value
.v_gobject
))) {
477 sprintf(dir_str
, "%s", g_quark_to_string(name
));
478 subtree
= (LttvAttribute
*)*(value
.v_gobject
);
479 gtk_tree_store_append (store
, &iter
, parent
);
480 gtk_tree_store_set (store
, &iter
,NAME_COLUMN
,dir_str
,-1);
481 path
= gtk_tree_model_get_path(GTK_TREE_MODEL(store
), &iter
);
482 str
= gtk_tree_path_to_string (path
);
483 g_hash_table_insert(statistic_viewer_data
->statistic_hash
,
484 (gpointer
)str
, subtree
);
485 show_tree(statistic_viewer_data
, subtree
, &iter
);
494 void show_statistic(StatisticViewerData
* statistic_viewer_data
,
495 LttvAttribute
* stats
, GtkTextBuffer
* buf
)
498 LttvAttribute
*subtree
;
499 LttvAttributeName name
;
500 LttvAttributeValue value
;
501 LttvAttributeType type
;
502 gchar type_name
[PATH_LENGTH
], type_value
[PATH_LENGTH
];
503 GtkTextIter text_iter
;
506 nb
= lttv_attribute_get_number(stats
);
507 for(i
= 0 ; i
< nb
; i
++) {
508 type
= lttv_attribute_get(stats
, i
, &name
, &value
);
509 sprintf(type_name
,"%s", g_quark_to_string(name
));
510 type_value
[0] = '\0';
513 sprintf(type_value
, " : %d\n", *value
.v_int
);
516 sprintf(type_value
, " : %u\n", *value
.v_uint
);
519 sprintf(type_value
, " : %ld\n", *value
.v_long
);
522 sprintf(type_value
, " : %lu\n", *value
.v_ulong
);
525 sprintf(type_value
, " : %f\n", (double)*value
.v_float
);
528 sprintf(type_value
, " : %f\n", *value
.v_double
);
531 sprintf(type_value
, " : %10u.%09u\n", value
.v_time
->tv_sec
,
532 value
.v_time
->tv_nsec
);
535 sprintf(type_value
, " : POINTER\n");
538 sprintf(type_value
, " : %s\n", *value
.v_string
);
543 if(strlen(type_value
)){
545 strcat(type_name
,type_value
);
546 gtk_text_buffer_get_end_iter(buf
, &text_iter
);
547 gtk_text_buffer_insert(buf
, &text_iter
, type_name
, strlen(type_name
));
552 sprintf(type_value
, "No statistic information in this directory.\nCheck in subdirectories please.\n");
553 gtk_text_buffer_get_end_iter(buf
, &text_iter
);
554 gtk_text_buffer_insert(buf
, &text_iter
, type_value
, strlen(type_value
));
559 gboolean
statistic_update_time_window(void * hook_data
, void * call_data
)
561 StatisticViewerData
*statistic_viewer_data
= (StatisticViewerData
*) hook_data
;
562 LttvTracesetContext
* tsc
= get_traceset_context(statistic_viewer_data
->mw
);
564 //if statistic is already calculated, do nothing
565 if(!statistic_viewer_data
->calculate_stats
){
569 if(statistic_viewer_data
->shown
== FALSE
){
570 statistic_add_context_hooks(statistic_viewer_data
, tsc
);
575 gboolean
statistic_show_viewer(void * hook_data
, void * call_data
)
577 StatisticViewerData
*statistic_viewer_data
= (StatisticViewerData
*) hook_data
;
578 LttvTracesetContext
* tsc
= get_traceset_context(statistic_viewer_data
->mw
);
580 if(statistic_viewer_data
->shown
== FALSE
){
581 statistic_viewer_data
->shown
= TRUE
;
582 show_traceset_stats(statistic_viewer_data
);
583 if(statistic_viewer_data
->calculate_stats
){
584 statistic_remove_context_hooks(statistic_viewer_data
,tsc
);
585 lttv_stats_save_statistics((LttvTracesetStats
*)tsc
);
592 gboolean
statistic_traceset_changed(void * hook_data
, void * call_data
)
594 StatisticViewerData
*statistic_viewer_data
= (StatisticViewerData
*) hook_data
;
596 // gtk_tree_store_clear (statistic_viewer_data->store_m);
597 // statistic_viewer_data->shown = FALSE;
602 void statistic_add_context_hooks(StatisticViewerData
* statistic_viewer_data
,
603 LttvTracesetContext
* tsc
)
605 gint i
, j
, nbi
, nb_tracefile
, nb_control
, nb_per_cpu
;
607 LttvTraceContext
*tc
;
608 LttvTracefileContext
*tfc
;
609 LttvTracesetSelector
* ts_s
;
610 LttvTraceSelector
* t_s
;
611 LttvTracefileSelector
* tf_s
;
614 ts_s
= (LttvTracesetSelector
*)g_object_get_data(G_OBJECT(statistic_viewer_data
->hpaned_v
),
615 statistic_viewer_data
->filter_key
);
617 //if there are hooks for traceset, add them here
619 nbi
= lttv_traceset_number(tsc
->ts
);
620 for(i
= 0 ; i
< nbi
; i
++) {
621 t_s
= lttv_traceset_selector_trace_get(ts_s
,i
);
622 selected
= lttv_trace_selector_get_selected(t_s
);
623 if(!selected
) continue;
626 //if there are hooks for trace, add them here
628 nb_control
= ltt_trace_control_tracefile_number(trace
);
629 nb_per_cpu
= ltt_trace_per_cpu_tracefile_number(trace
);
630 nb_tracefile
= nb_control
+ nb_per_cpu
;
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;
638 tfc
= tc
->control_tracefiles
[j
];
640 tfc
= tc
->per_cpu_tracefiles
[j
- nb_control
];
642 //if there are hooks for tracefile, add them here
643 // lttv_tracefile_context_add_hooks(tfc, NULL,NULL,NULL,NULL,
644 // statistic_viewer_data->before_event_hooks,NULL);
648 //add state and stats hooks
649 //state_add_event_hooks_api(statistic_viewer_data->mw); //it will be added in the main window
650 stats_add_event_hooks_api(statistic_viewer_data
->mw
);
654 void statistic_remove_context_hooks(StatisticViewerData
* statistic_viewer_data
,
655 LttvTracesetContext
* tsc
)
657 gint i
, j
, nbi
, nb_tracefile
, nb_control
, nb_per_cpu
;
659 LttvTraceContext
*tc
;
660 LttvTracefileContext
*tfc
;
661 LttvTracesetSelector
* ts_s
;
662 LttvTraceSelector
* t_s
;
663 LttvTracefileSelector
* tf_s
;
666 ts_s
= (LttvTracesetSelector
*)g_object_get_data(G_OBJECT(statistic_viewer_data
->hpaned_v
),
667 statistic_viewer_data
->filter_key
);
669 //if there are hooks for traceset, remove them here
671 nbi
= lttv_traceset_number(tsc
->ts
);
672 for(i
= 0 ; i
< nbi
; i
++) {
673 t_s
= lttv_traceset_selector_trace_get(ts_s
,i
);
674 selected
= lttv_trace_selector_get_selected(t_s
);
675 if(!selected
) continue;
678 //if there are hooks for trace, remove them here
680 nb_control
= ltt_trace_control_tracefile_number(trace
);
681 nb_per_cpu
= ltt_trace_per_cpu_tracefile_number(trace
);
682 nb_tracefile
= nb_control
+ nb_per_cpu
;
684 for(j
= 0 ; j
< nb_tracefile
; j
++) {
685 tf_s
= lttv_trace_selector_tracefile_get(t_s
,j
);
686 selected
= lttv_tracefile_selector_get_selected(tf_s
);
687 if(!selected
) continue;
690 tfc
= tc
->control_tracefiles
[j
];
692 tfc
= tc
->per_cpu_tracefiles
[j
- nb_control
];
694 //if there are hooks for tracefile, remove them here
695 // lttv_tracefile_context_remove_hooks(tfc, NULL,NULL,NULL,NULL,
696 // statistic_viewer_data->before_event_hooks,NULL);
700 //remove state and stats hooks
701 //state_remove_event_hooks_api(statistic_viewer_data->mw); //it will be done in the main window
702 stats_remove_event_hooks_api(statistic_viewer_data
->mw
);