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 | |
| 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>
| -rw-r--r-- | trace-graph.c | 89 | ||||
| -rw-r--r-- | trace-graph.h | 1 |
2 files changed, 86 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); |
diff --git a/trace-graph.h b/trace-graph.h index db15c50..91a3acd 100644 --- a/trace-graph.h +++ b/trace-graph.h | |||
| @@ -60,6 +60,7 @@ struct graph_info { | |||
| 60 | struct filter_task *task_filter; | 60 | struct filter_task *task_filter; |
| 61 | gint filter_task_selected; | 61 | gint filter_task_selected; |
| 62 | 62 | ||
| 63 | struct filter_task *hide_tasks; | ||
| 63 | 64 | ||
| 64 | /* Box info for CPU data info window */ | 65 | /* Box info for CPU data info window */ |
| 65 | gint cpu_data_x; | 66 | gint cpu_data_x; |
