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/lttv.h>
25 #include <lttv/module.h>
26 #include <lttv/gtktraceset.h>
27 #include <lttv/processTrace.h>
28 #include <lttv/hook.h>
29 #include <lttv/common.h>
30 #include <lttv/state.h>
31 #include <lttv/stats.h>
34 #include <ltt/event.h>
36 #include <ltt/trace.h>
40 #include "../icons/hGuiStatisticInsert.xpm"
42 #define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format)
43 #define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format)
45 #define PATH_LENGTH 256
47 static LttvModule
*statistic_main_win_module
;
48 static GPtrArray
* statistic_traceset
;
50 /** Array containing instanced objects. Used when module is unloaded */
51 static GSList
*g_statistic_viewer_data_list
= NULL
;
53 typedef struct _StatisticViewerData StatisticViewerData
;
55 //! Statistic Viewer's constructor hook
56 GtkWidget
*h_gui_statistic(MainWindow
*parent_window
, LttvTracesetSelector
* s
, char* key
);
57 //! Statistic Viewer's constructor
58 StatisticViewerData
*gui_statistic(MainWindow
*parent_window
,LttvTracesetSelector
* s
, char* key
);
59 //! Statistic Viewer's destructor
60 void gui_statistic_destructor(StatisticViewerData
*statistic_viewer_data
);
61 void gui_statistic_free(StatisticViewerData
*statistic_viewer_data
);
63 void grab_focus(GtkWidget
*widget
, gpointer data
);
64 static void tree_selection_changed_cb (GtkTreeSelection
*selection
, gpointer data
);
66 void statistic_destroy_hash_key(gpointer key
);
67 void statistic_destroy_hash_data(gpointer data
);
69 void show_traceset_stats(StatisticViewerData
* statistic_viewer_data
);
70 void show_tree(StatisticViewerData
* statistic_viewer_data
,
71 LttvAttribute
* stats
, GtkTreeIter
* parent
);
72 void show_statistic(StatisticViewerData
* statistic_viewer_data
,
73 LttvAttribute
* stats
, GtkTextBuffer
* buf
);
76 /** hook functions for update time interval, current time ... */
77 gboolean
statistic_update_time_window(void * hook_data
, void * call_data
);
78 gboolean
statistic_show_viewer(void * hook_data
, void * call_data
);
79 gboolean
statistic_traceset_changed(void * hook_data
, void * call_data
);
80 void statistic_add_context_hooks(StatisticViewerData
* statistic_viewer_data
,
81 LttvTracesetContext
* tsc
);
82 void statistic_remove_context_hooks(StatisticViewerData
* statistic_viewer_data
,
83 LttvTracesetContext
* tsc
);
85 gboolean
statistic_insert_traceset_stats(void * stats
);
93 struct _StatisticViewerData
{
95 LttvTracesetStats
* stats
;
96 gboolean calculate_stats
;
99 TimeInterval time_span
;
100 gboolean shown
; //indicate if the statistic is shown or not
103 GtkWidget
* hpaned_v
;
104 GtkTreeStore
* store_m
;
107 //scroll window containing Tree View
108 GtkWidget
* scroll_win_tree
;
111 //scroll window containing Text View
112 GtkWidget
* scroll_win_text
;
115 GtkTreeSelection
*select_c
;
118 GHashTable
*statistic_hash
;
123 * plugin's init function
125 * This function initializes the Statistic Viewer functionnality through the
128 G_MODULE_EXPORT
void init(LttvModule
*self
, int argc
, char *argv
[]) {
130 statistic_main_win_module
= lttv_module_require(self
, "mainwin", argc
, argv
);
132 if(statistic_main_win_module
== NULL
){
133 g_critical("Can't load Statistic Viewer : missing mainwin\n");
137 statistic_traceset
= g_ptr_array_new ();
139 /* Register the toolbar insert button */
140 toolbar_item_reg(hGuiStatisticInsert_xpm
, "Insert Statistic Viewer", h_gui_statistic
);
142 /* Register the menu item insert entry */
143 menu_item_reg("/", "Insert Statistic Viewer", h_gui_statistic
);
147 void statistic_destroy_walk(gpointer data
, gpointer user_data
)
149 gui_statistic_destructor((StatisticViewerData
*)data
);
153 * plugin's destroy function
155 * This function releases the memory reserved by the module and unregisters
156 * everything that has been registered in the gtkTraceSet API.
158 G_MODULE_EXPORT
void destroy() {
161 if(g_statistic_viewer_data_list
){
162 g_slist_foreach(g_statistic_viewer_data_list
, statistic_destroy_walk
, NULL
);
163 g_slist_free(g_statistic_viewer_data_list
);
165 g_ptr_array_free (statistic_traceset
, TRUE
);
167 /* Unregister the toolbar insert button */
168 toolbar_item_unreg(h_gui_statistic
);
170 /* Unregister the menu item insert entry */
171 menu_item_unreg(h_gui_statistic
);
176 gui_statistic_free(StatisticViewerData
*statistic_viewer_data
)
178 if(statistic_viewer_data
){
179 unreg_update_time_window(statistic_update_time_window
,statistic_viewer_data
, statistic_viewer_data
->mw
);
180 unreg_show_viewer(statistic_show_viewer
,statistic_viewer_data
, statistic_viewer_data
->mw
);
181 unreg_update_traceset(statistic_traceset_changed
,statistic_viewer_data
, statistic_viewer_data
->mw
);
183 g_hash_table_destroy(statistic_viewer_data
->statistic_hash
);
184 g_free(statistic_viewer_data
->filter_key
);
185 g_statistic_viewer_data_list
= g_slist_remove(g_statistic_viewer_data_list
, statistic_viewer_data
);
186 g_free(statistic_viewer_data
);
191 gui_statistic_destructor(StatisticViewerData
*statistic_viewer_data
)
193 /* May already been done by GTK window closing */
194 if(GTK_IS_WIDGET(statistic_viewer_data
->hpaned_v
)){
195 gui_statistic_free(statistic_viewer_data
);
196 gtk_widget_destroy(statistic_viewer_data
->hpaned_v
);
197 statistic_viewer_data
= NULL
;
199 //gui_statistic_free(statistic_viewer_data);
204 * Statistic Viewer's constructor hook
206 * This constructor is given as a parameter to the menuitem and toolbar button
207 * registration. It creates the list.
208 * @param parent_window A pointer to the parent window.
209 * @return The widget created.
212 h_gui_statistic(MainWindow
* parent_window
, LttvTracesetSelector
* s
, char* key
)
214 StatisticViewerData
* statistic_viewer_data
= gui_statistic(parent_window
, s
, key
) ;
216 if(statistic_viewer_data
)
217 return statistic_viewer_data
->hpaned_v
;
222 gboolean
statistic_insert_traceset_stats(void * stats
)
227 len
= statistic_traceset
->len
;
229 s
= g_ptr_array_index(statistic_traceset
, i
);
230 if(s
== stats
) break;
233 g_ptr_array_add(statistic_traceset
, stats
);
240 * Statistic Viewer's constructor
242 * This constructor is used to create StatisticViewerData data structure.
243 * @return The Statistic viewer data created.
245 StatisticViewerData
*
246 gui_statistic(MainWindow
*parent_window
, LttvTracesetSelector
* s
, char* key
)
248 GtkCellRenderer
*renderer
;
249 GtkTreeViewColumn
*column
;
251 StatisticViewerData
* statistic_viewer_data
= g_new(StatisticViewerData
,1);
253 statistic_viewer_data
->mw
= parent_window
;
254 statistic_viewer_data
->stats
= get_traceset_stats_api(statistic_viewer_data
->mw
);
255 statistic_viewer_data
->calculate_stats
= statistic_insert_traceset_stats((void *)statistic_viewer_data
->stats
);
257 reg_update_time_window(statistic_update_time_window
,statistic_viewer_data
, statistic_viewer_data
->mw
);
258 reg_show_viewer(statistic_show_viewer
,statistic_viewer_data
, statistic_viewer_data
->mw
);
259 reg_update_traceset(statistic_traceset_changed
,statistic_viewer_data
, statistic_viewer_data
->mw
);
261 statistic_viewer_data
->statistic_hash
= g_hash_table_new_full(g_str_hash
, g_str_equal
,
262 statistic_destroy_hash_key
,
263 statistic_destroy_hash_data
);
265 statistic_viewer_data
->hpaned_v
= gtk_hpaned_new();
266 statistic_viewer_data
->store_m
= gtk_tree_store_new (N_COLUMNS
, G_TYPE_STRING
);
267 statistic_viewer_data
->tree_v
= gtk_tree_view_new_with_model (GTK_TREE_MODEL (statistic_viewer_data
->store_m
));
268 g_object_unref (G_OBJECT (statistic_viewer_data
->store_m
));
270 g_signal_connect (G_OBJECT (statistic_viewer_data
->tree_v
), "grab-focus",
271 G_CALLBACK (grab_focus
),
272 statistic_viewer_data
);
274 // Setup the selection handler
275 statistic_viewer_data
->select_c
= gtk_tree_view_get_selection (GTK_TREE_VIEW (statistic_viewer_data
->tree_v
));
276 gtk_tree_selection_set_mode (statistic_viewer_data
->select_c
, GTK_SELECTION_SINGLE
);
277 g_signal_connect (G_OBJECT (statistic_viewer_data
->select_c
), "changed",
278 G_CALLBACK (tree_selection_changed_cb
),
279 statistic_viewer_data
);
281 renderer
= gtk_cell_renderer_text_new ();
282 column
= gtk_tree_view_column_new_with_attributes ("Statistic Name",
286 gtk_tree_view_column_set_alignment (column
, 0.0);
287 // gtk_tree_view_column_set_fixed_width (column, 45);
288 gtk_tree_view_append_column (GTK_TREE_VIEW (statistic_viewer_data
->tree_v
), column
);
291 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (statistic_viewer_data
->tree_v
), FALSE
);
293 statistic_viewer_data
->scroll_win_tree
= gtk_scrolled_window_new (NULL
, NULL
);
294 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(statistic_viewer_data
->scroll_win_tree
),
295 GTK_POLICY_AUTOMATIC
,GTK_POLICY_AUTOMATIC
);
297 gtk_container_add (GTK_CONTAINER (statistic_viewer_data
->scroll_win_tree
), statistic_viewer_data
->tree_v
);
298 gtk_paned_pack1(GTK_PANED(statistic_viewer_data
->hpaned_v
),statistic_viewer_data
->scroll_win_tree
, TRUE
, FALSE
);
299 gtk_paned_set_position(GTK_PANED(statistic_viewer_data
->hpaned_v
), 160);
301 statistic_viewer_data
->scroll_win_text
= gtk_scrolled_window_new (NULL
, NULL
);
302 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(statistic_viewer_data
->scroll_win_text
),
303 GTK_POLICY_AUTOMATIC
,GTK_POLICY_AUTOMATIC
);
305 statistic_viewer_data
->text_v
= gtk_text_view_new ();
306 g_signal_connect (G_OBJECT (statistic_viewer_data
->text_v
), "grab-focus",
307 G_CALLBACK (grab_focus
),
308 statistic_viewer_data
);
310 gtk_text_view_set_editable(GTK_TEXT_VIEW(statistic_viewer_data
->text_v
),FALSE
);
311 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(statistic_viewer_data
->text_v
),FALSE
);
312 gtk_container_add (GTK_CONTAINER (statistic_viewer_data
->scroll_win_text
), statistic_viewer_data
->text_v
);
313 gtk_paned_pack2(GTK_PANED(statistic_viewer_data
->hpaned_v
), statistic_viewer_data
->scroll_win_text
, TRUE
, FALSE
);
315 gtk_widget_show(statistic_viewer_data
->scroll_win_tree
);
316 gtk_widget_show(statistic_viewer_data
->scroll_win_text
);
317 gtk_widget_show(statistic_viewer_data
->tree_v
);
318 gtk_widget_show(statistic_viewer_data
->text_v
);
319 gtk_widget_show(statistic_viewer_data
->hpaned_v
);
321 //get the life span of the traceset and set the upper of the scroll bar
322 get_traceset_time_span(statistic_viewer_data
->mw
, &statistic_viewer_data
->time_span
);
324 statistic_viewer_data
->shown
= FALSE
;
325 statistic_viewer_data
->filter_key
= g_strdup(key
);
327 G_OBJECT(statistic_viewer_data
->hpaned_v
),
328 statistic_viewer_data
->filter_key
,
332 G_OBJECT(statistic_viewer_data
->hpaned_v
),
334 &statistic_viewer_data
->time_span
);
336 if(statistic_viewer_data
->calculate_stats
){
337 if(lttv_stats_load_statistics(statistic_viewer_data
->stats
))
338 statistic_viewer_data
->calculate_stats
= FALSE
;
341 if(statistic_viewer_data
->calculate_stats
== FALSE
){
342 statistic_viewer_data
->size
= 1;
344 G_OBJECT(statistic_viewer_data
->hpaned_v
),
346 &statistic_viewer_data
->size
);
349 g_object_set_data_full(
350 G_OBJECT(statistic_viewer_data
->hpaned_v
),
351 "statistic_viewer_data",
352 statistic_viewer_data
,
353 (GDestroyNotify
)gui_statistic_free
);
355 /* Add the object's information to the module's array */
356 g_statistic_viewer_data_list
= g_slist_append(
357 g_statistic_viewer_data_list
,
358 statistic_viewer_data
);
360 return statistic_viewer_data
;
363 void grab_focus(GtkWidget
*widget
, gpointer data
)
365 StatisticViewerData
*statistic_viewer_data
= (StatisticViewerData
*)data
;
366 MainWindow
* mw
= statistic_viewer_data
->mw
;
367 set_focused_pane(mw
, gtk_widget_get_parent(statistic_viewer_data
->hpaned_v
));
371 tree_selection_changed_cb (GtkTreeSelection
*selection
, gpointer data
)
373 StatisticViewerData
*statistic_viewer_data
= (StatisticViewerData
*)data
;
375 GtkTreeModel
*model
= GTK_TREE_MODEL(statistic_viewer_data
->store_m
);
380 GtkTextIter text_iter
;
381 LttvAttribute
* stats
;
383 if (gtk_tree_selection_get_selected (selection
, &model
, &iter
))
385 gtk_tree_model_get (model
, &iter
, NAME_COLUMN
, &event
, -1);
387 path
= gtk_tree_model_get_path(GTK_TREE_MODEL(model
),&iter
);
388 str
= gtk_tree_path_to_string (path
);
389 stats
= (LttvAttribute
*)g_hash_table_lookup (statistic_viewer_data
->statistic_hash
,str
);
392 buf
= gtk_text_view_get_buffer((GtkTextView
*)statistic_viewer_data
->text_v
);
393 gtk_text_buffer_set_text(buf
,"Statistic for '", -1);
394 gtk_text_buffer_get_end_iter(buf
, &text_iter
);
395 gtk_text_buffer_insert(buf
, &text_iter
, event
, strlen(event
));
396 gtk_text_buffer_get_end_iter(buf
, &text_iter
);
397 gtk_text_buffer_insert(buf
, &text_iter
, "' :\n\n",5);
399 show_statistic(statistic_viewer_data
, stats
, buf
);
405 void statistic_destroy_hash_key(gpointer key
)
410 void statistic_destroy_hash_data(gpointer data
)
415 void show_traceset_stats(StatisticViewerData
* statistic_viewer_data
)
420 LttSystemDescription
*desc
;
421 LttvTracesetStats
* tscs
= statistic_viewer_data
->stats
;
422 gchar
* str
, trace_str
[PATH_LENGTH
];
425 GtkTreeStore
* store
= statistic_viewer_data
->store_m
;
427 if(tscs
->stats
== NULL
) return;
429 ts
= tscs
->parent
.parent
.ts
;
430 nb
= lttv_traceset_number(ts
);
433 gtk_tree_store_append (store
, &iter
, NULL
);
434 gtk_tree_store_set (store
, &iter
,
435 NAME_COLUMN
, "Traceset statistics",
437 path
= gtk_tree_model_get_path(GTK_TREE_MODEL(store
), &iter
);
438 str
= gtk_tree_path_to_string (path
);
439 g_hash_table_insert(statistic_viewer_data
->statistic_hash
,
440 (gpointer
)str
, tscs
->stats
);
441 show_tree(statistic_viewer_data
, tscs
->stats
, &iter
);
443 //show stats for all traces
444 for(i
= 0 ; i
< nb
; i
++) {
445 tcs
= (LttvTraceStats
*)(LTTV_TRACESET_CONTEXT(tscs
)->traces
[i
]);
446 desc
= ltt_trace_system_description(tcs
->parent
.parent
.t
);
447 sprintf(trace_str
, "Trace on system %s at time %d secs",
448 ltt_trace_system_description_node_name(desc
),
449 (ltt_trace_system_description_trace_start_time(desc
)).tv_sec
);
451 gtk_tree_store_append (store
, &iter
, NULL
);
452 gtk_tree_store_set (store
, &iter
,NAME_COLUMN
,trace_str
,-1);
453 path
= gtk_tree_model_get_path(GTK_TREE_MODEL(store
), &iter
);
454 str
= gtk_tree_path_to_string (path
);
455 g_hash_table_insert(statistic_viewer_data
->statistic_hash
,
456 (gpointer
)str
,tcs
->stats
);
457 show_tree(statistic_viewer_data
, tcs
->stats
, &iter
);
461 void show_tree(StatisticViewerData
* statistic_viewer_data
,
462 LttvAttribute
* stats
, GtkTreeIter
* parent
)
465 LttvAttribute
*subtree
;
466 LttvAttributeName name
;
467 LttvAttributeValue value
;
468 LttvAttributeType type
;
469 gchar
* str
, dir_str
[PATH_LENGTH
];
472 GtkTreeStore
* store
= statistic_viewer_data
->store_m
;
474 nb
= lttv_attribute_get_number(stats
);
475 for(i
= 0 ; i
< nb
; i
++) {
476 type
= lttv_attribute_get(stats
, i
, &name
, &value
);
479 if(LTTV_IS_ATTRIBUTE(*(value
.v_gobject
))) {
480 sprintf(dir_str
, "%s", g_quark_to_string(name
));
481 subtree
= (LttvAttribute
*)*(value
.v_gobject
);
482 gtk_tree_store_append (store
, &iter
, parent
);
483 gtk_tree_store_set (store
, &iter
,NAME_COLUMN
,dir_str
,-1);
484 path
= gtk_tree_model_get_path(GTK_TREE_MODEL(store
), &iter
);
485 str
= gtk_tree_path_to_string (path
);
486 g_hash_table_insert(statistic_viewer_data
->statistic_hash
,
487 (gpointer
)str
, subtree
);
488 show_tree(statistic_viewer_data
, subtree
, &iter
);
497 void show_statistic(StatisticViewerData
* statistic_viewer_data
,
498 LttvAttribute
* stats
, GtkTextBuffer
* buf
)
501 LttvAttribute
*subtree
;
502 LttvAttributeName name
;
503 LttvAttributeValue value
;
504 LttvAttributeType type
;
505 gchar type_name
[PATH_LENGTH
], type_value
[PATH_LENGTH
];
506 GtkTextIter text_iter
;
509 nb
= lttv_attribute_get_number(stats
);
510 for(i
= 0 ; i
< nb
; i
++) {
511 type
= lttv_attribute_get(stats
, i
, &name
, &value
);
512 sprintf(type_name
,"%s", g_quark_to_string(name
));
513 type_value
[0] = '\0';
516 sprintf(type_value
, " : %d\n", *value
.v_int
);
519 sprintf(type_value
, " : %u\n", *value
.v_uint
);
522 sprintf(type_value
, " : %ld\n", *value
.v_long
);
525 sprintf(type_value
, " : %lu\n", *value
.v_ulong
);
528 sprintf(type_value
, " : %f\n", (double)*value
.v_float
);
531 sprintf(type_value
, " : %f\n", *value
.v_double
);
534 sprintf(type_value
, " : %10u.%09u\n", value
.v_time
->tv_sec
,
535 value
.v_time
->tv_nsec
);
538 sprintf(type_value
, " : POINTER\n");
541 sprintf(type_value
, " : %s\n", *value
.v_string
);
546 if(strlen(type_value
)){
548 strcat(type_name
,type_value
);
549 gtk_text_buffer_get_end_iter(buf
, &text_iter
);
550 gtk_text_buffer_insert(buf
, &text_iter
, type_name
, strlen(type_name
));
555 sprintf(type_value
, "No statistic information in this directory.\nCheck in subdirectories please.\n");
556 gtk_text_buffer_get_end_iter(buf
, &text_iter
);
557 gtk_text_buffer_insert(buf
, &text_iter
, type_value
, strlen(type_value
));
562 gboolean
statistic_update_time_window(void * hook_data
, void * call_data
)
564 StatisticViewerData
*statistic_viewer_data
= (StatisticViewerData
*) hook_data
;
565 LttvTracesetContext
* tsc
= get_traceset_context(statistic_viewer_data
->mw
);
567 //if statistic is already calculated, do nothing
568 if(!statistic_viewer_data
->calculate_stats
){
572 if(statistic_viewer_data
->shown
== FALSE
){
573 statistic_add_context_hooks(statistic_viewer_data
, tsc
);
578 gboolean
statistic_show_viewer(void * hook_data
, void * call_data
)
580 StatisticViewerData
*statistic_viewer_data
= (StatisticViewerData
*) hook_data
;
581 LttvTracesetContext
* tsc
= get_traceset_context(statistic_viewer_data
->mw
);
583 if(statistic_viewer_data
->shown
== FALSE
){
584 statistic_viewer_data
->shown
= TRUE
;
585 show_traceset_stats(statistic_viewer_data
);
586 if(statistic_viewer_data
->calculate_stats
){
587 statistic_remove_context_hooks(statistic_viewer_data
,tsc
);
588 lttv_stats_save_statistics((LttvTracesetStats
*)tsc
);
595 gboolean
statistic_traceset_changed(void * hook_data
, void * call_data
)
597 StatisticViewerData
*statistic_viewer_data
= (StatisticViewerData
*) hook_data
;
599 gtk_tree_store_clear (statistic_viewer_data
->store_m
);
600 statistic_viewer_data
->shown
= FALSE
;
605 void statistic_add_context_hooks(StatisticViewerData
* statistic_viewer_data
,
606 LttvTracesetContext
* tsc
)
608 gint i
, j
, nbi
, nb_tracefile
, nb_control
, nb_per_cpu
;
610 LttvTraceContext
*tc
;
611 LttvTracefileContext
*tfc
;
612 LttvTracesetSelector
* ts_s
;
613 LttvTraceSelector
* t_s
;
614 LttvTracefileSelector
* tf_s
;
617 ts_s
= (LttvTracesetSelector
*)g_object_get_data(G_OBJECT(statistic_viewer_data
->hpaned_v
),
618 statistic_viewer_data
->filter_key
);
620 //if there are hooks for traceset, add them here
622 nbi
= lttv_traceset_number(tsc
->ts
);
623 for(i
= 0 ; i
< nbi
; i
++) {
624 t_s
= lttv_traceset_selector_trace_get(ts_s
,i
);
625 selected
= lttv_trace_selector_get_selected(t_s
);
626 if(!selected
) continue;
629 //if there are hooks for trace, add them here
631 nb_control
= ltt_trace_control_tracefile_number(trace
);
632 nb_per_cpu
= ltt_trace_per_cpu_tracefile_number(trace
);
633 nb_tracefile
= nb_control
+ nb_per_cpu
;
635 for(j
= 0 ; j
< nb_tracefile
; j
++) {
636 tf_s
= lttv_trace_selector_tracefile_get(t_s
,j
);
637 selected
= lttv_tracefile_selector_get_selected(tf_s
);
638 if(!selected
) continue;
641 tfc
= tc
->control_tracefiles
[j
];
643 tfc
= tc
->per_cpu_tracefiles
[j
- nb_control
];
645 //if there are hooks for tracefile, add them here
646 // lttv_tracefile_context_add_hooks(tfc, NULL,NULL,NULL,NULL,
647 // statistic_viewer_data->before_event_hooks,NULL);
651 //add state and stats hooks
652 //state_add_event_hooks_api(statistic_viewer_data->mw); //it will be added in the main window
653 stats_add_event_hooks_api(statistic_viewer_data
->mw
);
657 void statistic_remove_context_hooks(StatisticViewerData
* statistic_viewer_data
,
658 LttvTracesetContext
* tsc
)
660 gint i
, j
, nbi
, nb_tracefile
, nb_control
, nb_per_cpu
;
662 LttvTraceContext
*tc
;
663 LttvTracefileContext
*tfc
;
664 LttvTracesetSelector
* ts_s
;
665 LttvTraceSelector
* t_s
;
666 LttvTracefileSelector
* tf_s
;
669 ts_s
= (LttvTracesetSelector
*)g_object_get_data(G_OBJECT(statistic_viewer_data
->hpaned_v
),
670 statistic_viewer_data
->filter_key
);
672 //if there are hooks for traceset, remove them here
674 nbi
= lttv_traceset_number(tsc
->ts
);
675 for(i
= 0 ; i
< nbi
; i
++) {
676 t_s
= lttv_traceset_selector_trace_get(ts_s
,i
);
677 selected
= lttv_trace_selector_get_selected(t_s
);
678 if(!selected
) continue;
681 //if there are hooks for trace, remove them here
683 nb_control
= ltt_trace_control_tracefile_number(trace
);
684 nb_per_cpu
= ltt_trace_per_cpu_tracefile_number(trace
);
685 nb_tracefile
= nb_control
+ nb_per_cpu
;
687 for(j
= 0 ; j
< nb_tracefile
; j
++) {
688 tf_s
= lttv_trace_selector_tracefile_get(t_s
,j
);
689 selected
= lttv_tracefile_selector_get_selected(tf_s
);
690 if(!selected
) continue;
693 tfc
= tc
->control_tracefiles
[j
];
695 tfc
= tc
->per_cpu_tracefiles
[j
- nb_control
];
697 //if there are hooks for tracefile, remove them here
698 // lttv_tracefile_context_remove_hooks(tfc, NULL,NULL,NULL,NULL,
699 // statistic_viewer_data->before_event_hooks,NULL);
703 //remove state and stats hooks
704 //state_remove_event_hooks_api(statistic_viewer_data->mw); //it will be done in the main window
705 stats_remove_event_hooks_api(statistic_viewer_data
->mw
);