fix short name collisions in options : the last module loaded overrides previous...
[lttv.git] / ltt / branches / poly / lttv / modules / gui / statistics / statistics.c
CommitLineData
b6374ffa 1/* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2003-2004 XangXiu Yang
3 *
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;
7 *
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.
12 *
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,
16 * MA 02111-1307, USA.
17 */
18
6b1d3120 19#include <glib.h>
6b1d3120 20#include <gtk/gtk.h>
21#include <gdk/gdk.h>
22
2a2fa4f0 23#include <lttv/lttv.h>
6b1d3120 24#include <lttv/module.h>
5ac76b22 25#include <lttvwindow/viewer.h>
d8f124de 26#include <lttv/tracecontext.h>
6b1d3120 27#include <lttv/hook.h>
13f86ce2 28#include <lttvwindow/common.h>
6b1d3120 29#include <lttv/state.h>
30#include <lttv/stats.h>
31
32#include <ltt/ltt.h>
33#include <ltt/event.h>
34#include <ltt/type.h>
35#include <ltt/trace.h>
36
37#include <string.h>
38
0c56e138 39#include "hGuiStatisticInsert.xpm"
6b1d3120 40
dbb7bb09 41#define PATH_LENGTH 256 /* CHECK */
6b1d3120 42
10f2da95 43static LttvModule *statistic_main_win_module;
5b2cdf0e 44static GPtrArray * statistic_traceset;
6b1d3120 45
46/** Array containing instanced objects. Used when module is unloaded */
10f2da95 47static GSList *g_statistic_viewer_data_list = NULL ;
6b1d3120 48
49typedef struct _StatisticViewerData StatisticViewerData;
50
51//! Statistic Viewer's constructor hook
49bf71b5 52GtkWidget *h_gui_statistic(MainWindow *parent_window, LttvTracesetSelector * s, char* key);
6b1d3120 53//! Statistic Viewer's constructor
49bf71b5 54StatisticViewerData *gui_statistic(MainWindow *parent_window,LttvTracesetSelector * s, char* key);
6b1d3120 55//! Statistic Viewer's destructor
10f2da95 56void gui_statistic_destructor(StatisticViewerData *statistic_viewer_data);
57void gui_statistic_free(StatisticViewerData *statistic_viewer_data);
6b1d3120 58
59void grab_focus(GtkWidget *widget, gpointer data);
60static void tree_selection_changed_cb (GtkTreeSelection *selection, gpointer data);
61
2176f952 62void statistic_destroy_hash_key(gpointer key);
63void statistic_destroy_hash_data(gpointer data);
6b1d3120 64
10f2da95 65void show_traceset_stats(StatisticViewerData * statistic_viewer_data);
66void show_tree(StatisticViewerData * statistic_viewer_data,
8d70e03b 67 LttvAttribute* stats, GtkTreeIter* parent);
10f2da95 68void show_statistic(StatisticViewerData * statistic_viewer_data,
8d70e03b 69 LttvAttribute* stats, GtkTextBuffer* buf);
6b1d3120 70
71
a8c0f09d 72/** hook functions for update time interval, current time ... */
73gboolean statistic_update_time_window(void * hook_data, void * call_data);
74gboolean statistic_show_viewer(void * hook_data, void * call_data);
75gboolean statistic_traceset_changed(void * hook_data, void * call_data);
76void statistic_add_context_hooks(StatisticViewerData * statistic_viewer_data,
8d70e03b 77 LttvTracesetContext * tsc);
a8c0f09d 78void statistic_remove_context_hooks(StatisticViewerData * statistic_viewer_data,
8d70e03b 79 LttvTracesetContext * tsc);
a8c0f09d 80
5b2cdf0e 81gboolean statistic_insert_traceset_stats(void * stats);
82
6b1d3120 83enum
84{
85 NAME_COLUMN,
86 N_COLUMNS
87};
88
89struct _StatisticViewerData{
bca3b81f 90 MainWindow * mw;
6b1d3120 91 LttvTracesetStats * stats;
5b2cdf0e 92 gboolean calculate_stats;
93 int size;
6b1d3120 94
224446ce 95 //TimeInterval time_span;
a8c0f09d 96 gboolean shown; //indicate if the statistic is shown or not
97 char * filter_key;
98
10f2da95 99 GtkWidget * hpaned_v;
100 GtkTreeStore * store_m;
101 GtkWidget * tree_v;
6b1d3120 102
103 //scroll window containing Tree View
10f2da95 104 GtkWidget * scroll_win_tree;
6b1d3120 105
10f2da95 106 GtkWidget * text_v;
6b1d3120 107 //scroll window containing Text View
10f2da95 108 GtkWidget * scroll_win_text;
6b1d3120 109
110 // Selection handler
10f2da95 111 GtkTreeSelection *select_c;
6b1d3120 112
113 //hash
10f2da95 114 GHashTable *statistic_hash;
6b1d3120 115};
116
117
6b1d3120 118void
10f2da95 119gui_statistic_free(StatisticViewerData *statistic_viewer_data)
6b1d3120 120{
10f2da95 121 if(statistic_viewer_data){
224446ce 122 lttvwindow_unregister_time_window_notify(statistic_viewer_data->mw,
123 statistic_update_time_window,statistic_viewer_data);
a43d67ba 124 lttvwindow_unregister_show_notify(statistic_viewer_data->mw,
224446ce 125 statistic_show_viewer,statistic_viewer_data);
126 lttvwindow_unregister_traceset_notify(statistic_viewer_data->mw,
127 statistic_traceset_changed,statistic_viewer_data);
a8c0f09d 128
10f2da95 129 g_hash_table_destroy(statistic_viewer_data->statistic_hash);
a8c0f09d 130 g_free(statistic_viewer_data->filter_key);
10f2da95 131 g_statistic_viewer_data_list = g_slist_remove(g_statistic_viewer_data_list, statistic_viewer_data);
132 g_free(statistic_viewer_data);
7a859036 133 }
6b1d3120 134}
135
136void
10f2da95 137gui_statistic_destructor(StatisticViewerData *statistic_viewer_data)
6b1d3120 138{
139 /* May already been done by GTK window closing */
10f2da95 140 if(GTK_IS_WIDGET(statistic_viewer_data->hpaned_v)){
e4d09234 141 gui_statistic_free(statistic_viewer_data);
10f2da95 142 gtk_widget_destroy(statistic_viewer_data->hpaned_v);
143 statistic_viewer_data = NULL;
7a859036 144 }
10f2da95 145 //gui_statistic_free(statistic_viewer_data);
6b1d3120 146}
147
148
149/**
150 * Statistic Viewer's constructor hook
151 *
152 * This constructor is given as a parameter to the menuitem and toolbar button
153 * registration. It creates the list.
10f2da95 154 * @param parent_window A pointer to the parent window.
6b1d3120 155 * @return The widget created.
156 */
157GtkWidget *
49bf71b5 158h_gui_statistic(MainWindow * parent_window, LttvTracesetSelector * s, char* key)
6b1d3120 159{
49bf71b5 160 StatisticViewerData* statistic_viewer_data = gui_statistic(parent_window, s, key) ;
6b1d3120 161
10f2da95 162 if(statistic_viewer_data)
163 return statistic_viewer_data->hpaned_v;
6b1d3120 164 else return NULL;
8d70e03b 165
6b1d3120 166}
167
5b2cdf0e 168gboolean statistic_insert_traceset_stats(void * stats)
169{
170 int i, len;
171 gpointer s;
172
173 len = statistic_traceset->len;
174 for(i=0;i<len;i++){
175 s = g_ptr_array_index(statistic_traceset, i);
176 if(s == stats) break;
177 }
178 if(i==len){
179 g_ptr_array_add(statistic_traceset, stats);
180 return TRUE;
181 }
182 return FALSE;
183}
184
6b1d3120 185/**
186 * Statistic Viewer's constructor
187 *
188 * This constructor is used to create StatisticViewerData data structure.
189 * @return The Statistic viewer data created.
190 */
191StatisticViewerData *
49bf71b5 192gui_statistic(MainWindow *parent_window, LttvTracesetSelector * s, char* key)
6b1d3120 193{
194 GtkCellRenderer *renderer;
195 GtkTreeViewColumn *column;
196
10f2da95 197 StatisticViewerData* statistic_viewer_data = g_new(StatisticViewerData,1);
6b1d3120 198
10f2da95 199 statistic_viewer_data->mw = parent_window;
224446ce 200 statistic_viewer_data->stats =
201 lttvwindow_get_traceset_stats(statistic_viewer_data->mw);
5b2cdf0e 202 statistic_viewer_data->calculate_stats = statistic_insert_traceset_stats((void *)statistic_viewer_data->stats);
6b1d3120 203
224446ce 204 lttvwindow_register_time_window_notify(statistic_viewer_data->mw,
205 statistic_update_time_window,statistic_viewer_data);
a43d67ba 206 lttvwindow_register_show_notify(statistic_viewer_data->mw,
224446ce 207 statistic_show_viewer,statistic_viewer_data);
208 lttvwindow_register_traceset_notify(statistic_viewer_data->mw,
209 statistic_traceset_changed,statistic_viewer_data);
a8c0f09d 210
224446ce 211 statistic_viewer_data->statistic_hash = g_hash_table_new_full(g_str_hash,
212 g_str_equal,
213 statistic_destroy_hash_key,
214 statistic_destroy_hash_data);
6b1d3120 215
10f2da95 216 statistic_viewer_data->hpaned_v = gtk_hpaned_new();
217 statistic_viewer_data->store_m = gtk_tree_store_new (N_COLUMNS, G_TYPE_STRING);
224446ce 218 statistic_viewer_data->tree_v =
219 gtk_tree_view_new_with_model (
220 GTK_TREE_MODEL (statistic_viewer_data->store_m));
10f2da95 221 g_object_unref (G_OBJECT (statistic_viewer_data->store_m));
6b1d3120 222
10f2da95 223 g_signal_connect (G_OBJECT (statistic_viewer_data->tree_v), "grab-focus",
8d70e03b 224 G_CALLBACK (grab_focus),
225 statistic_viewer_data);
6b1d3120 226
227 // Setup the selection handler
10f2da95 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",
8d70e03b 231 G_CALLBACK (tree_selection_changed_cb),
232 statistic_viewer_data);
6b1d3120 233
234 renderer = gtk_cell_renderer_text_new ();
235 column = gtk_tree_view_column_new_with_attributes ("Statistic Name",
8d70e03b 236 renderer,
237 "text", NAME_COLUMN,
238 NULL);
6b1d3120 239 gtk_tree_view_column_set_alignment (column, 0.0);
240 // gtk_tree_view_column_set_fixed_width (column, 45);
10f2da95 241 gtk_tree_view_append_column (GTK_TREE_VIEW (statistic_viewer_data->tree_v), column);
6b1d3120 242
243
10f2da95 244 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (statistic_viewer_data->tree_v), FALSE);
6b1d3120 245
10f2da95 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),
8d70e03b 248 GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
6b1d3120 249
10f2da95 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);
6b1d3120 253
10f2da95 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),
8d70e03b 256 GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
6b1d3120 257
10f2da95 258 statistic_viewer_data->text_v = gtk_text_view_new ();
259 g_signal_connect (G_OBJECT (statistic_viewer_data->text_v), "grab-focus",
8d70e03b 260 G_CALLBACK (grab_focus),
261 statistic_viewer_data);
6b1d3120 262
10f2da95 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);
6b1d3120 267
10f2da95 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);
6b1d3120 273
a8c0f09d 274 statistic_viewer_data->shown = FALSE;
275 statistic_viewer_data->filter_key = g_strdup(key);
49bf71b5 276 g_object_set_data(
8d70e03b 277 G_OBJECT(statistic_viewer_data->hpaned_v),
278 statistic_viewer_data->filter_key,
279 s);
224446ce 280 /*
a8c0f09d 281 g_object_set_data(
8d70e03b 282 G_OBJECT(statistic_viewer_data->hpaned_v),
283 TRACESET_TIME_SPAN,
284 &statistic_viewer_data->time_span);
224446ce 285 */
286
9f797243 287 if(statistic_viewer_data->calculate_stats){
f95bc830 288 //if(lttv_stats_load_statistics(statistic_viewer_data->stats))
289 // statistic_viewer_data->calculate_stats = FALSE;
9f797243 290 }
a8c0f09d 291
5b2cdf0e 292 if(statistic_viewer_data->calculate_stats == FALSE){
293 statistic_viewer_data->size = 1;
294 g_object_set_data(
8d70e03b 295 G_OBJECT(statistic_viewer_data->hpaned_v),
296 MAX_NUMBER_EVENT,
297 &statistic_viewer_data->size);
5b2cdf0e 298 }
299
6b1d3120 300 g_object_set_data_full(
8d70e03b 301 G_OBJECT(statistic_viewer_data->hpaned_v),
302 "statistic_viewer_data",
303 statistic_viewer_data,
304 (GDestroyNotify)gui_statistic_free);
6b1d3120 305
306 /* Add the object's information to the module's array */
10f2da95 307 g_statistic_viewer_data_list = g_slist_append(
8d70e03b 308 g_statistic_viewer_data_list,
309 statistic_viewer_data);
6b1d3120 310
10f2da95 311 return statistic_viewer_data;
6b1d3120 312}
313
314void grab_focus(GtkWidget *widget, gpointer data)
315{
10f2da95 316 StatisticViewerData *statistic_viewer_data = (StatisticViewerData *)data;
bca3b81f 317 MainWindow * mw = statistic_viewer_data->mw;
665f0e65 318 lttvwindow_report_focus(mw, statistic_viewer_data->hpaned_v);
6b1d3120 319}
320
321static void
322tree_selection_changed_cb (GtkTreeSelection *selection, gpointer data)
323{
10f2da95 324 StatisticViewerData *statistic_viewer_data = (StatisticViewerData*)data;
6b1d3120 325 GtkTreeIter iter;
10f2da95 326 GtkTreeModel *model = GTK_TREE_MODEL(statistic_viewer_data->store_m);
327 gchar *event;
6b1d3120 328 GtkTextBuffer* buf;
329 gchar * str;
330 GtkTreePath * path;
331 GtkTextIter text_iter;
332 LttvAttribute * stats;
333
334 if (gtk_tree_selection_get_selected (selection, &model, &iter))
335 {
10f2da95 336 gtk_tree_model_get (model, &iter, NAME_COLUMN, &event, -1);
6b1d3120 337
338 path = gtk_tree_model_get_path(GTK_TREE_MODEL(model),&iter);
339 str = gtk_tree_path_to_string (path);
10f2da95 340 stats = (LttvAttribute*)g_hash_table_lookup (statistic_viewer_data->statistic_hash,str);
6b1d3120 341 g_free(str);
342
10f2da95 343 buf = gtk_text_view_get_buffer((GtkTextView*)statistic_viewer_data->text_v);
6b1d3120 344 gtk_text_buffer_set_text(buf,"Statistic for '", -1);
345 gtk_text_buffer_get_end_iter(buf, &text_iter);
10f2da95 346 gtk_text_buffer_insert(buf, &text_iter, event, strlen(event));
6b1d3120 347 gtk_text_buffer_get_end_iter(buf, &text_iter);
348 gtk_text_buffer_insert(buf, &text_iter, "' :\n\n",5);
349
10f2da95 350 show_statistic(statistic_viewer_data, stats, buf);
6b1d3120 351
10f2da95 352 g_free (event);
6b1d3120 353 }
354}
355
2176f952 356void statistic_destroy_hash_key(gpointer key)
6b1d3120 357{
358 g_free(key);
359}
360
2176f952 361void statistic_destroy_hash_data(gpointer data)
6b1d3120 362{
363 // g_free(data);
364}
365
10f2da95 366void show_traceset_stats(StatisticViewerData * statistic_viewer_data)
6b1d3120 367{
368 int i, nb;
369 LttvTraceset *ts;
370 LttvTraceStats *tcs;
371 LttSystemDescription *desc;
10f2da95 372 LttvTracesetStats * tscs = statistic_viewer_data->stats;
6b1d3120 373 gchar * str, trace_str[PATH_LENGTH];
374 GtkTreePath * path;
375 GtkTreeIter iter;
10f2da95 376 GtkTreeStore * store = statistic_viewer_data->store_m;
6b1d3120 377
378 if(tscs->stats == NULL) return;
379
912be9a5 380 ts = tscs->parent.parent.ts;
381 nb = lttv_traceset_number(ts);
382 if(nb == 0)return;
383
6b1d3120 384 gtk_tree_store_append (store, &iter, NULL);
385 gtk_tree_store_set (store, &iter,
8d70e03b 386 NAME_COLUMN, "Traceset statistics",
387 -1);
388 path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
6b1d3120 389 str = gtk_tree_path_to_string (path);
10f2da95 390 g_hash_table_insert(statistic_viewer_data->statistic_hash,
8d70e03b 391 (gpointer)str, tscs->stats);
10f2da95 392 show_tree(statistic_viewer_data, tscs->stats, &iter);
6b1d3120 393
394 //show stats for all traces
6b1d3120 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",
8d70e03b 399 ltt_trace_system_description_node_name(desc),
400 (ltt_trace_system_description_trace_start_time(desc)).tv_sec);
6b1d3120 401
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);
10f2da95 406 g_hash_table_insert(statistic_viewer_data->statistic_hash,
8d70e03b 407 (gpointer)str,tcs->stats);
10f2da95 408 show_tree(statistic_viewer_data, tcs->stats, &iter);
6b1d3120 409 }
410}
411
10f2da95 412void show_tree(StatisticViewerData * statistic_viewer_data,
8d70e03b 413 LttvAttribute* stats, GtkTreeIter* parent)
6b1d3120 414{
415 int i, nb;
416 LttvAttribute *subtree;
417 LttvAttributeName name;
418 LttvAttributeValue value;
419 LttvAttributeType type;
420 gchar * str, dir_str[PATH_LENGTH];
421 GtkTreePath * path;
422 GtkTreeIter iter;
10f2da95 423 GtkTreeStore * store = statistic_viewer_data->store_m;
6b1d3120 424
425 nb = lttv_attribute_get_number(stats);
426 for(i = 0 ; i < nb ; i++) {
427 type = lttv_attribute_get(stats, i, &name, &value);
428 switch(type) {
429 case LTTV_GOBJECT:
430 if(LTTV_IS_ATTRIBUTE(*(value.v_gobject))) {
8d70e03b 431 sprintf(dir_str, "%s", g_quark_to_string(name));
6b1d3120 432 subtree = (LttvAttribute *)*(value.v_gobject);
8d70e03b 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);
10f2da95 439 show_tree(statistic_viewer_data, subtree, &iter);
6b1d3120 440 }
441 break;
442 default:
8d70e03b 443 break;
6b1d3120 444 }
445 }
446}
447
10f2da95 448void show_statistic(StatisticViewerData * statistic_viewer_data,
8d70e03b 449 LttvAttribute* stats, GtkTextBuffer* buf)
6b1d3120 450{
451 int i, nb , flag;
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;
458
459 flag = 0;
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';
465 switch(type) {
466 case LTTV_INT:
467 sprintf(type_value, " : %d\n", *value.v_int);
468 break;
469 case LTTV_UINT:
470 sprintf(type_value, " : %u\n", *value.v_uint);
471 break;
472 case LTTV_LONG:
473 sprintf(type_value, " : %ld\n", *value.v_long);
474 break;
475 case LTTV_ULONG:
476 sprintf(type_value, " : %lu\n", *value.v_ulong);
477 break;
478 case LTTV_FLOAT:
479 sprintf(type_value, " : %f\n", (double)*value.v_float);
480 break;
481 case LTTV_DOUBLE:
482 sprintf(type_value, " : %f\n", *value.v_double);
483 break;
484 case LTTV_TIME:
485 sprintf(type_value, " : %10u.%09u\n", value.v_time->tv_sec,
486 value.v_time->tv_nsec);
487 break;
488 case LTTV_POINTER:
489 sprintf(type_value, " : POINTER\n");
490 break;
491 case LTTV_STRING:
492 sprintf(type_value, " : %s\n", *value.v_string);
493 break;
494 default:
495 break;
496 }
497 if(strlen(type_value)){
498 flag = 1;
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));
502 }
503 }
504
505 if(flag == 0){
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));
509
510 }
511}
512
a8c0f09d 513gboolean statistic_update_time_window(void * hook_data, void * call_data)
514{
515 StatisticViewerData *statistic_viewer_data = (StatisticViewerData*) hook_data;
224446ce 516 LttvTracesetContext * tsc =
517 lttvwindow_get_traceset_context(statistic_viewer_data->mw);
a8c0f09d 518
5b2cdf0e 519 //if statistic is already calculated, do nothing
520 if(!statistic_viewer_data->calculate_stats){
521 return FALSE;
522 }
523
a8c0f09d 524 if(statistic_viewer_data->shown == FALSE){
525 statistic_add_context_hooks(statistic_viewer_data, tsc);
526 }
527 return FALSE;
528}
529
530gboolean statistic_show_viewer(void * hook_data, void * call_data)
531{
532 StatisticViewerData *statistic_viewer_data = (StatisticViewerData*) hook_data;
224446ce 533 LttvTracesetContext * tsc =
534 lttvwindow_get_traceset_context(statistic_viewer_data->mw);
a8c0f09d 535
536 if(statistic_viewer_data->shown == FALSE){
537 statistic_viewer_data->shown = TRUE;
538 show_traceset_stats(statistic_viewer_data);
5b2cdf0e 539 if(statistic_viewer_data->calculate_stats){
540 statistic_remove_context_hooks(statistic_viewer_data,tsc);
f95bc830 541 //lttv_stats_save_statistics((LttvTracesetStats*)tsc);
5b2cdf0e 542 }
a8c0f09d 543 }
544
545 return FALSE;
546}
547
548gboolean statistic_traceset_changed(void * hook_data, void * call_data)
549{
550 StatisticViewerData *statistic_viewer_data = (StatisticViewerData*) hook_data;
551
21e8c385 552 gtk_tree_store_clear (statistic_viewer_data->store_m);
553 statistic_viewer_data->shown = FALSE;
a8c0f09d 554
555 return FALSE;
556}
557
558void statistic_add_context_hooks(StatisticViewerData * statistic_viewer_data,
8d70e03b 559 LttvTracesetContext * tsc)
a8c0f09d 560{
dbb7bb09 561 gint i, j, nbi, nb_tracefile;
a8c0f09d 562 LttTrace *trace;
563 LttvTraceContext *tc;
564 LttvTracefileContext *tfc;
565 LttvTracesetSelector * ts_s;
566 LttvTraceSelector * t_s;
567 LttvTracefileSelector * tf_s;
568 gboolean selected;
569
570 ts_s = (LttvTracesetSelector*)g_object_get_data(G_OBJECT(statistic_viewer_data->hpaned_v),
8d70e03b 571 statistic_viewer_data->filter_key);
a8c0f09d 572
573 //if there are hooks for traceset, add them here
574
575 nbi = lttv_traceset_number(tsc->ts);
576 for(i = 0 ; i < nbi ; i++) {
ed3b99b6 577 t_s = lttv_traceset_selector_trace_get(ts_s,i);
a8c0f09d 578 selected = lttv_trace_selector_get_selected(t_s);
579 if(!selected) continue;
580 tc = tsc->traces[i];
581 trace = tc->t;
582 //if there are hooks for trace, add them here
583
dbb7bb09 584 nb_tracefile = ltt_trace_control_tracefile_number(trace) +
585 ltt_trace_per_cpu_tracefile_number(trace);
a8c0f09d 586
587 for(j = 0 ; j < nb_tracefile ; j++) {
ed3b99b6 588 tf_s = lttv_trace_selector_tracefile_get(t_s,j);
a8c0f09d 589 selected = lttv_tracefile_selector_get_selected(tf_s);
590 if(!selected) continue;
dbb7bb09 591 tfc = tc->tracefiles[j];
a8c0f09d 592
593 //if there are hooks for tracefile, add them here
594 // lttv_tracefile_context_add_hooks(tfc, NULL,NULL,NULL,NULL,
8d70e03b 595 // statistic_viewer_data->before_event_hooks,NULL);
a8c0f09d 596 }
597 }
598
224446ce 599 lttv_stats_add_event_hooks(LTTV_TRACESET_STATS(tsc));
a8c0f09d 600
601}
602
603void statistic_remove_context_hooks(StatisticViewerData * statistic_viewer_data,
8d70e03b 604 LttvTracesetContext * tsc)
a8c0f09d 605{
dbb7bb09 606 gint i, j, nbi, nb_tracefile;
a8c0f09d 607 LttTrace *trace;
608 LttvTraceContext *tc;
609 LttvTracefileContext *tfc;
610 LttvTracesetSelector * ts_s;
611 LttvTraceSelector * t_s;
612 LttvTracefileSelector * tf_s;
613 gboolean selected;
614
615 ts_s = (LttvTracesetSelector*)g_object_get_data(G_OBJECT(statistic_viewer_data->hpaned_v),
8d70e03b 616 statistic_viewer_data->filter_key);
a8c0f09d 617
618 //if there are hooks for traceset, remove them here
619
620 nbi = lttv_traceset_number(tsc->ts);
621 for(i = 0 ; i < nbi ; i++) {
ed3b99b6 622 t_s = lttv_traceset_selector_trace_get(ts_s,i);
a8c0f09d 623 selected = lttv_trace_selector_get_selected(t_s);
624 if(!selected) continue;
625 tc = tsc->traces[i];
626 trace = tc->t;
627 //if there are hooks for trace, remove them here
628
dbb7bb09 629 nb_tracefile = ltt_trace_control_tracefile_number(trace) +
630 ltt_trace_per_cpu_tracefile_number(trace);
a8c0f09d 631
632 for(j = 0 ; j < nb_tracefile ; j++) {
ed3b99b6 633 tf_s = lttv_trace_selector_tracefile_get(t_s,j);
a8c0f09d 634 selected = lttv_tracefile_selector_get_selected(tf_s);
635 if(!selected) continue;
dbb7bb09 636 tfc = tc->tracefiles[j];
a8c0f09d 637
638 //if there are hooks for tracefile, remove them here
639 // lttv_tracefile_context_remove_hooks(tfc, NULL,NULL,NULL,NULL,
8d70e03b 640 // statistic_viewer_data->before_event_hooks,NULL);
a8c0f09d 641 }
642 }
643
224446ce 644 lttv_stats_remove_event_hooks(LTTV_TRACESET_STATS(tsc));
a8c0f09d 645}
646
6b1d3120 647
08b1c66e 648/**
649 * plugin's init function
650 *
651 * This function initializes the Statistic Viewer functionnality through the
652 * gtkTraceSet API.
653 */
654static void init() {
655
656 statistic_traceset = g_ptr_array_new ();
657
658 /* Register the toolbar insert button */
224446ce 659 lttvwindow_register_toolbar(hGuiStatisticInsert_xpm, "Insert Statistic Viewer", h_gui_statistic);
08b1c66e 660
661 /* Register the menu item insert entry */
224446ce 662 lttvwindow_register_menu("/", "Insert Statistic Viewer", h_gui_statistic);
08b1c66e 663
664}
665
666void statistic_destroy_walk(gpointer data, gpointer user_data)
667{
668 gui_statistic_destructor((StatisticViewerData*)data);
669}
670
671/**
672 * plugin's destroy function
673 *
674 * This function releases the memory reserved by the module and unregisters
675 * everything that has been registered in the gtkTraceSet API.
676 */
677static void destroy() {
678 int i;
679
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);
683 }
684 g_ptr_array_free (statistic_traceset, TRUE);
685
686 /* Unregister the toolbar insert button */
224446ce 687 lttvwindow_unregister_toolbar(h_gui_statistic);
08b1c66e 688
689 /* Unregister the menu item insert entry */
224446ce 690 lttvwindow_unregister_menu(h_gui_statistic);
08b1c66e 691}
692
693
694LTTV_MODULE("guistatistics", "Statistics viewer", \
695 "Graphical module to view statistics about processes, CPUs and systems", \
db2c9c14 696 init, destroy, "lttvwindow")
08b1c66e 697
This page took 0.060843 seconds and 4 git commands to generate.