aboutsummaryrefslogtreecommitdiffstats
path: root/trace-graph.c
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2010-01-07 13:35:30 -0500
committerSteven Rostedt <rostedt@goodmis.org>2010-01-07 13:35:30 -0500
commita05d33d998204da39c13d764ef16e280423c8f3e (patch)
tree4c22eec24aed65a816cea620082a37efc858834b /trace-graph.c
parent2eeffcc06ca7ed7f3dd85f40ad744292169a8ce8 (diff)
trace-graph: Add hiding of tasks
Add option to hide tasks. This acts as the opposite of filtering. If a task is added to the hidden list, then it will not show up. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'trace-graph.c')
-rw-r--r--trace-graph.c89
1 files changed, 85 insertions, 4 deletions
diff --git a/trace-graph.c b/trace-graph.c
index 8457edf..b530314 100644
--- a/trace-graph.c
+++ b/trace-graph.c
@@ -88,6 +88,12 @@ trace_graph_filter_task_find_pid(struct graph_info *ginfo, gint pid)
88 return filter_task_find_pid(ginfo->task_filter, pid); 88 return filter_task_find_pid(ginfo->task_filter, pid);
89} 89}
90 90
91struct filter_task_item *
92trace_graph_hide_task_find_pid(struct graph_info *ginfo, gint pid)
93{
94 return filter_task_find_pid(ginfo->hide_tasks, pid);
95}
96
91static void graph_filter_task_add_pid(struct graph_info *ginfo, gint pid) 97static void graph_filter_task_add_pid(struct graph_info *ginfo, gint pid)
92{ 98{
93 filter_task_add_pid(ginfo->task_filter, pid); 99 filter_task_add_pid(ginfo->task_filter, pid);
@@ -99,7 +105,26 @@ static void graph_filter_task_remove_pid(struct graph_info *ginfo, gint pid)
99{ 105{
100 filter_task_remove_pid(ginfo->task_filter, pid); 106 filter_task_remove_pid(ginfo->task_filter, pid);
101 107
102 if (!filter_task_count(ginfo->task_filter)) { 108 if (!filter_task_count(ginfo->task_filter) &&
109 !filter_task_count(ginfo->hide_tasks)) {
110 ginfo->filter_available = 0;
111 ginfo->filter_enabled = 0;
112 }
113}
114
115static void graph_hide_task_add_pid(struct graph_info *ginfo, gint pid)
116{
117 filter_task_add_pid(ginfo->hide_tasks, pid);
118
119 ginfo->filter_available = 1;
120}
121
122static void graph_hide_task_remove_pid(struct graph_info *ginfo, gint pid)
123{
124 filter_task_remove_pid(ginfo->hide_tasks, pid);
125
126 if (!filter_task_count(ginfo->task_filter) &&
127 !filter_task_count(ginfo->hide_tasks)) {
103 ginfo->filter_available = 0; 128 ginfo->filter_available = 0;
104 ginfo->filter_enabled = 0; 129 ginfo->filter_enabled = 0;
105 } 130 }
@@ -108,6 +133,7 @@ static void graph_filter_task_remove_pid(struct graph_info *ginfo, gint pid)
108static void graph_filter_task_clear(struct graph_info *ginfo) 133static void graph_filter_task_clear(struct graph_info *ginfo)
109{ 134{
110 filter_task_clear(ginfo->task_filter); 135 filter_task_clear(ginfo->task_filter);
136 filter_task_clear(ginfo->hide_tasks);
111 137
112 ginfo->filter_available = 0; 138 ginfo->filter_available = 0;
113 ginfo->filter_enabled = 0; 139 ginfo->filter_enabled = 0;
@@ -177,8 +203,10 @@ gboolean graph_filter_on_task(struct graph_info *ginfo, gint pid)
177 filter = FALSE; 203 filter = FALSE;
178 204
179 if (ginfo->filter_enabled && 205 if (ginfo->filter_enabled &&
180 filter_task_count(ginfo->task_filter) && 206 ((filter_task_count(ginfo->task_filter) &&
181 !trace_graph_filter_task_find_pid(ginfo, pid)) 207 !trace_graph_filter_task_find_pid(ginfo, pid)) ||
208 (filter_task_count(ginfo->hide_tasks) &&
209 trace_graph_hide_task_find_pid(ginfo, pid))))
182 filter = TRUE; 210 filter = TRUE;
183 211
184 return filter; 212 return filter;
@@ -320,6 +348,23 @@ void trace_graph_filter_add_remove_task(struct graph_info *ginfo,
320 redraw_graph(ginfo); 348 redraw_graph(ginfo);
321} 349}
322 350
351void trace_graph_filter_hide_show_task(struct graph_info *ginfo,
352 gint pid)
353{
354 gint filter_enabled = ginfo->filter_enabled;
355 struct filter_task_item *task;
356
357 task = trace_graph_hide_task_find_pid(ginfo, pid);
358
359 if (task)
360 graph_hide_task_remove_pid(ginfo, task->pid);
361 else
362 graph_hide_task_add_pid(ginfo, pid);
363
364 if (filter_enabled)
365 redraw_graph(ginfo);
366}
367
323static void 368static void
324filter_add_task_clicked (gpointer data) 369filter_add_task_clicked (gpointer data)
325{ 370{
@@ -328,6 +373,14 @@ filter_add_task_clicked (gpointer data)
328 trace_graph_filter_add_remove_task(ginfo, ginfo->filter_task_selected); 373 trace_graph_filter_add_remove_task(ginfo, ginfo->filter_task_selected);
329} 374}
330 375
376static void
377filter_hide_task_clicked (gpointer data)
378{
379 struct graph_info *ginfo = data;
380
381 trace_graph_filter_hide_show_task(ginfo, ginfo->filter_task_selected);
382}
383
331void trace_graph_clear_tasks(struct graph_info *ginfo) 384void trace_graph_clear_tasks(struct graph_info *ginfo)
332{ 385{
333 gint filter_enabled = ginfo->filter_enabled; 386 gint filter_enabled = ginfo->filter_enabled;
@@ -353,6 +406,7 @@ do_pop_up(GtkWidget *widget, GdkEventButton *event, gpointer data)
353 static GtkWidget *menu; 406 static GtkWidget *menu;
354 static GtkWidget *menu_filter_enable; 407 static GtkWidget *menu_filter_enable;
355 static GtkWidget *menu_filter_add_task; 408 static GtkWidget *menu_filter_add_task;
409 static GtkWidget *menu_filter_hide_task;
356 static GtkWidget *menu_filter_clear_tasks; 410 static GtkWidget *menu_filter_clear_tasks;
357 struct record *record = NULL; 411 struct record *record = NULL;
358 const char *comm; 412 const char *comm;
@@ -384,6 +438,14 @@ do_pop_up(GtkWidget *widget, GdkEventButton *event, gpointer data)
384 G_CALLBACK (filter_add_task_clicked), 438 G_CALLBACK (filter_add_task_clicked),
385 data); 439 data);
386 440
441 menu_filter_hide_task = gtk_menu_item_new_with_label("Hide Task");
442 gtk_widget_show(menu_filter_hide_task);
443 gtk_menu_shell_append(GTK_MENU_SHELL (menu), menu_filter_hide_task);
444
445 g_signal_connect_swapped (G_OBJECT (menu_filter_hide_task), "activate",
446 G_CALLBACK (filter_hide_task_clicked),
447 data);
448
387 menu_filter_clear_tasks = gtk_menu_item_new_with_label("Clear Task Filter"); 449 menu_filter_clear_tasks = gtk_menu_item_new_with_label("Clear Task Filter");
388 gtk_widget_show(menu_filter_clear_tasks); 450 gtk_widget_show(menu_filter_clear_tasks);
389 gtk_menu_shell_append(GTK_MENU_SHELL (menu), menu_filter_clear_tasks); 451 gtk_menu_shell_append(GTK_MENU_SHELL (menu), menu_filter_clear_tasks);
@@ -406,7 +468,8 @@ do_pop_up(GtkWidget *widget, GdkEventButton *event, gpointer data)
406 else 468 else
407 gtk_widget_set_sensitive(menu_filter_enable, FALSE); 469 gtk_widget_set_sensitive(menu_filter_enable, FALSE);
408 470
409 if (filter_task_count(ginfo->task_filter)) 471 if (filter_task_count(ginfo->task_filter) ||
472 filter_task_count(ginfo->hide_tasks))
410 gtk_widget_set_sensitive(menu_filter_clear_tasks, TRUE); 473 gtk_widget_set_sensitive(menu_filter_clear_tasks, TRUE);
411 else 474 else
412 gtk_widget_set_sensitive(menu_filter_clear_tasks, FALSE); 475 gtk_widget_set_sensitive(menu_filter_clear_tasks, FALSE);
@@ -439,15 +502,29 @@ do_pop_up(GtkWidget *widget, GdkEventButton *event, gpointer data)
439 502
440 gtk_menu_item_set_label(GTK_MENU_ITEM(menu_filter_add_task), 503 gtk_menu_item_set_label(GTK_MENU_ITEM(menu_filter_add_task),
441 text); 504 text);
505
506 if (trace_graph_hide_task_find_pid(ginfo, pid))
507 snprintf(text, len, "Show %s-%d to filter", comm, pid);
508 else
509 snprintf(text, len, "Hide %s-%d to filter", comm, pid);
510
511 gtk_menu_item_set_label(GTK_MENU_ITEM(menu_filter_hide_task),
512 text);
513
442 g_free(text); 514 g_free(text);
443 515
444 gtk_widget_set_sensitive(menu_filter_add_task, TRUE); 516 gtk_widget_set_sensitive(menu_filter_add_task, TRUE);
517 gtk_widget_set_sensitive(menu_filter_hide_task, TRUE);
445 518
446 free_record(record); 519 free_record(record);
447 } else { 520 } else {
448 gtk_menu_item_set_label(GTK_MENU_ITEM(menu_filter_add_task), 521 gtk_menu_item_set_label(GTK_MENU_ITEM(menu_filter_add_task),
449 "Add task to filter"); 522 "Add task to filter");
450 gtk_widget_set_sensitive(menu_filter_add_task, FALSE); 523 gtk_widget_set_sensitive(menu_filter_add_task, FALSE);
524
525 gtk_menu_item_set_label(GTK_MENU_ITEM(menu_filter_hide_task),
526 "Hide task to filter");
527 gtk_widget_set_sensitive(menu_filter_hide_task, FALSE);
451 } 528 }
452 529
453 530
@@ -1576,6 +1653,9 @@ destroy_event(GtkWidget *widget, gpointer data)
1576 graph_free_systems(ginfo); 1653 graph_free_systems(ginfo);
1577 graph_free_events(ginfo); 1654 graph_free_events(ginfo);
1578 1655
1656 filter_task_hash_free(ginfo->task_filter);
1657 filter_task_hash_free(ginfo->hide_tasks);
1658
1579 if (ginfo->test) 1659 if (ginfo->test)
1580 dprintf(1, "test = %s\n", ginfo->test); 1660 dprintf(1, "test = %s\n", ginfo->test);
1581 1661
@@ -1704,6 +1784,7 @@ trace_graph_create_with_callbacks(struct tracecmd_input *handle,
1704 ginfo->end_time = 0; 1784 ginfo->end_time = 0;
1705 1785
1706 ginfo->task_filter = filter_task_hash_alloc(); 1786 ginfo->task_filter = filter_task_hash_alloc();
1787 ginfo->hide_tasks = filter_task_hash_alloc();
1707 1788
1708 ginfo->widget = gtk_hbox_new(FALSE, 0); 1789 ginfo->widget = gtk_hbox_new(FALSE, 0);
1709 gtk_widget_show(ginfo->widget); 1790 gtk_widget_show(ginfo->widget);