diff options
author | Steven Rostedt <srostedt@redhat.com> | 2010-01-07 13:35:30 -0500 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2010-01-07 13:35:30 -0500 |
commit | a05d33d998204da39c13d764ef16e280423c8f3e (patch) | |
tree | 4c22eec24aed65a816cea620082a37efc858834b /trace-graph.c | |
parent | 2eeffcc06ca7ed7f3dd85f40ad744292169a8ce8 (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.c | 89 |
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 | ||
91 | struct filter_task_item * | ||
92 | trace_graph_hide_task_find_pid(struct graph_info *ginfo, gint pid) | ||
93 | { | ||
94 | return filter_task_find_pid(ginfo->hide_tasks, pid); | ||
95 | } | ||
96 | |||
91 | static void graph_filter_task_add_pid(struct graph_info *ginfo, gint pid) | 97 | static 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 | |||
115 | static 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 | |||
122 | static 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) | |||
108 | static void graph_filter_task_clear(struct graph_info *ginfo) | 133 | static 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 | ||
351 | void 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 | |||
323 | static void | 368 | static void |
324 | filter_add_task_clicked (gpointer data) | 369 | filter_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 | ||
376 | static void | ||
377 | filter_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 | |||
331 | void trace_graph_clear_tasks(struct graph_info *ginfo) | 384 | void 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); |