diff options
author | Steven Rostedt <srostedt@redhat.com> | 2010-01-07 12:59:49 -0500 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2010-01-07 12:59:49 -0500 |
commit | 0efdbd63ff75def9d0ad3162b83a4eb44472d341 (patch) | |
tree | 556dc94c3e5874f6806d56d82bf9b5929f3f694f | |
parent | cd6621ae612c78d9423123cb918cd1d6a149fcf4 (diff) |
trace-graph: Implement event filtering for the graph
Move some of the trace-view event filtering to be generic enough and
have the trace-graph use it.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | trace-filter.c | 20 | ||||
-rw-r--r-- | trace-filter.h | 62 | ||||
-rw-r--r-- | trace-graph-main.c | 53 | ||||
-rw-r--r-- | trace-graph.c | 152 | ||||
-rw-r--r-- | trace-graph.h | 16 | ||||
-rw-r--r-- | trace-hash.c | 21 | ||||
-rw-r--r-- | trace-hash.h | 5 | ||||
-rw-r--r-- | trace-view-store.c | 1 | ||||
-rw-r--r-- | trace-view.h | 52 |
10 files changed, 298 insertions, 86 deletions
@@ -52,7 +52,7 @@ trace-cmd:: trace-cmd.o trace-read.o | |||
52 | trace-view:: trace-view-main.o $(TRACE_VIEW_OBJS) | 52 | trace-view:: trace-view-main.o $(TRACE_VIEW_OBJS) |
53 | $(CC) $^ -rdynamic -o $@ $(CONFIG_LIBS) $(LIBS) | 53 | $(CC) $^ -rdynamic -o $@ $(CONFIG_LIBS) $(LIBS) |
54 | 54 | ||
55 | trace-graph:: trace-graph-main.o trace-graph.o trace-compat.o trace-hash.o | 55 | trace-graph:: trace-graph-main.o trace-graph.o trace-compat.o trace-hash.o trace-filter.o |
56 | $(CC) $^ -rdynamic -o $@ $(CONFIG_LIBS) $(LIBS) | 56 | $(CC) $^ -rdynamic -o $@ $(CONFIG_LIBS) $(LIBS) |
57 | 57 | ||
58 | kernelshark:: kernel-shark.o trace-compat.o $(TRACE_VIEW_OBJS) trace-graph.o \ | 58 | kernelshark:: kernel-shark.o trace-compat.o $(TRACE_VIEW_OBJS) trace-graph.o \ |
diff --git a/trace-filter.c b/trace-filter.c index 894448e..ab30b1f 100644 --- a/trace-filter.c +++ b/trace-filter.c | |||
@@ -12,6 +12,26 @@ | |||
12 | #define DIALOG_WIDTH 400 | 12 | #define DIALOG_WIDTH 400 |
13 | #define DIALOG_HEIGHT 600 | 13 | #define DIALOG_HEIGHT 600 |
14 | 14 | ||
15 | int str_cmp(const void *a, const void *b) | ||
16 | { | ||
17 | char * const * sa = a; | ||
18 | char * const * sb = b; | ||
19 | |||
20 | return strcmp(*sa, *sb); | ||
21 | } | ||
22 | |||
23 | int id_cmp(const void *a, const void *b) | ||
24 | { | ||
25 | const gint *ia = a; | ||
26 | const gint *ib = b; | ||
27 | |||
28 | if (*ia > *ib) | ||
29 | return 1; | ||
30 | if (*ia < *ib) | ||
31 | return -1; | ||
32 | return 0; | ||
33 | } | ||
34 | |||
15 | struct dialog_helper { | 35 | struct dialog_helper { |
16 | GtkWidget *dialog; | 36 | GtkWidget *dialog; |
17 | gpointer data; | 37 | gpointer data; |
diff --git a/trace-filter.h b/trace-filter.h new file mode 100644 index 0000000..ced654e --- /dev/null +++ b/trace-filter.h | |||
@@ -0,0 +1,62 @@ | |||
1 | #ifndef _TRACE_FILTER_H | ||
2 | #define _TRACE_FILTER_H | ||
3 | |||
4 | #include <gtk/gtk.h> | ||
5 | |||
6 | struct event_filter_list { | ||
7 | struct event_filter_list *next; | ||
8 | struct event *event; | ||
9 | }; | ||
10 | |||
11 | /** | ||
12 | * trace_filter_event_cb_func - callback type for event dialog | ||
13 | * @accept: TRUE if the accept button was pressed, otherwise FALSE | ||
14 | * @all_events: TRUE if "All Events" was checked | ||
15 | * @systems: NULL or a string array of systems terminated with NULL | ||
16 | * @events: NULL or a int array of event ids terminated with -1 | ||
17 | * @data: The data given passed in to the event dialog function | ||
18 | * | ||
19 | * If @accept is FALSE then @all_events, @systems, and @events | ||
20 | * should be ignored. @data is still valid. | ||
21 | * | ||
22 | * If @all_events is TRUE then @systems and @events should be ignored. | ||
23 | */ | ||
24 | typedef void (*trace_filter_event_cb_func)(gboolean accept, | ||
25 | gboolean all_events, | ||
26 | char **systems, | ||
27 | gint *events, | ||
28 | gpointer data); | ||
29 | |||
30 | void trace_filter_event_dialog(struct tracecmd_input *handle, | ||
31 | gboolean all_events, | ||
32 | gchar **systems, | ||
33 | gint *events, | ||
34 | trace_filter_event_cb_func func, | ||
35 | gpointer data); | ||
36 | |||
37 | /** | ||
38 | * trace_filter_cpu_cb_func - callback type for CPU dialog | ||
39 | * @accept: TRUE if the accept button was pressed, otherwise FALSE | ||
40 | * @all_cpus: TRUE if "All CPUS" was checked | ||
41 | * @selected_cpus: NULL or a cpu_mask with the cpus that were checked set. | ||
42 | * @data: The data given passed in to the CPU dialog function | ||
43 | * | ||
44 | * If @accept is FALSE then @all_cpus and @selected_cpus should be ignored. | ||
45 | * @data is still valid. | ||
46 | * | ||
47 | * If @all_cpus is TRUE then @selected_cpus should be ignored. | ||
48 | */ | ||
49 | typedef void (*trace_filter_cpu_cb_func)(gboolean accept, | ||
50 | gboolean all_cpus, | ||
51 | guint64 *selected_cpus, | ||
52 | gpointer data); | ||
53 | |||
54 | void trace_filter_cpu_dialog(gboolean all_cpus, guint64 *cpu_mask_selected, gint cpus, | ||
55 | trace_filter_cpu_cb_func func, gpointer data); | ||
56 | |||
57 | /* put here because there's no other place */ | ||
58 | |||
59 | int str_cmp(const void *a, const void *b); | ||
60 | int id_cmp(const void *a, const void *b); | ||
61 | |||
62 | #endif /* _TRACE_FILTER_H */ | ||
diff --git a/trace-graph-main.c b/trace-graph-main.c index de6bd12..80907d2 100644 --- a/trace-graph-main.c +++ b/trace-graph-main.c | |||
@@ -5,6 +5,7 @@ | |||
5 | 5 | ||
6 | #include "trace-cmd.h" | 6 | #include "trace-cmd.h" |
7 | #include "trace-graph.h" | 7 | #include "trace-graph.h" |
8 | #include "trace-filter.h" | ||
8 | 9 | ||
9 | #define version "0.1.1" | 10 | #define version "0.1.1" |
10 | 11 | ||
@@ -41,6 +42,24 @@ delete_event (GtkWidget *widget, GdkEvent *event, gpointer data) | |||
41 | return TRUE; | 42 | return TRUE; |
42 | } | 43 | } |
43 | 44 | ||
45 | /* Callback for the clicked signal of the Events filter button */ | ||
46 | static void | ||
47 | events_clicked (gpointer data) | ||
48 | { | ||
49 | struct graph_info *ginfo = data; | ||
50 | gboolean all_events = TRUE; | ||
51 | gchar **systems = NULL; | ||
52 | gint *events = NULL; | ||
53 | |||
54 | all_events = ginfo->all_events; | ||
55 | systems = ginfo->systems; | ||
56 | events = ginfo->event_ids; | ||
57 | |||
58 | trace_filter_event_dialog(ginfo->handle, all_events, | ||
59 | systems, events, | ||
60 | trace_graph_event_filter_callback, ginfo); | ||
61 | } | ||
62 | |||
44 | void trace_graph(int argc, char **argv) | 63 | void trace_graph(int argc, char **argv) |
45 | { | 64 | { |
46 | struct tracecmd_input *handle; | 65 | struct tracecmd_input *handle; |
@@ -81,6 +100,9 @@ void trace_graph(int argc, char **argv) | |||
81 | 100 | ||
82 | gtk_init(&argc, &argv); | 101 | gtk_init(&argc, &argv); |
83 | 102 | ||
103 | /* graph struct is used by handlers */ | ||
104 | ginfo = trace_graph_create(handle); | ||
105 | |||
84 | /* --- Main window --- */ | 106 | /* --- Main window --- */ |
85 | 107 | ||
86 | window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | 108 | window = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
@@ -127,6 +149,36 @@ void trace_graph(int argc, char **argv) | |||
127 | /* --- end File options --- */ | 149 | /* --- end File options --- */ |
128 | 150 | ||
129 | 151 | ||
152 | /* --- Filter Option --- */ | ||
153 | |||
154 | menu_item = gtk_menu_item_new_with_label("Filter"); | ||
155 | gtk_widget_show(menu_item); | ||
156 | |||
157 | gtk_menu_bar_append(GTK_MENU_BAR (menu_bar), menu_item); | ||
158 | |||
159 | menu = gtk_menu_new(); /* Don't need to show menus */ | ||
160 | |||
161 | |||
162 | /* --- Filter - Events Option --- */ | ||
163 | |||
164 | sub_item = gtk_menu_item_new_with_label("events"); | ||
165 | |||
166 | /* Add them to the menu */ | ||
167 | gtk_menu_shell_append(GTK_MENU_SHELL (menu), sub_item); | ||
168 | |||
169 | /* We can attach the Quit menu item to our exit function */ | ||
170 | g_signal_connect_swapped (G_OBJECT (sub_item), "activate", | ||
171 | G_CALLBACK (events_clicked), | ||
172 | (gpointer) ginfo); | ||
173 | |||
174 | /* We do need to show menu items */ | ||
175 | gtk_widget_show(sub_item); | ||
176 | |||
177 | |||
178 | /* --- End Filter Options --- */ | ||
179 | gtk_menu_item_set_submenu(GTK_MENU_ITEM (menu_item), menu); | ||
180 | |||
181 | |||
130 | /* --- Top Level Hbox --- */ | 182 | /* --- Top Level Hbox --- */ |
131 | 183 | ||
132 | hbox = gtk_hbox_new(FALSE, 0); | 184 | hbox = gtk_hbox_new(FALSE, 0); |
@@ -136,7 +188,6 @@ void trace_graph(int argc, char **argv) | |||
136 | 188 | ||
137 | /* --- Set up the Graph --- */ | 189 | /* --- Set up the Graph --- */ |
138 | 190 | ||
139 | ginfo = trace_graph_create(handle); | ||
140 | widget = trace_graph_get_window(ginfo); | 191 | widget = trace_graph_get_window(ginfo); |
141 | gtk_box_pack_start(GTK_BOX (hbox), widget, TRUE, TRUE, 0); | 192 | gtk_box_pack_start(GTK_BOX (hbox), widget, TRUE, TRUE, 0); |
142 | gtk_widget_show(widget); | 193 | gtk_widget_show(widget); |
diff --git a/trace-graph.c b/trace-graph.c index 5f1464c..8457edf 100644 --- a/trace-graph.c +++ b/trace-graph.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include "trace-local.h" | 30 | #include "trace-local.h" |
31 | #include "trace-graph.h" | 31 | #include "trace-graph.h" |
32 | #include "trace-hash.h" | 32 | #include "trace-hash.h" |
33 | #include "trace-filter.h" | ||
33 | 34 | ||
34 | #define DEBUG_LEVEL 2 | 35 | #define DEBUG_LEVEL 2 |
35 | #if DEBUG_LEVEL > 0 | 36 | #if DEBUG_LEVEL > 0 |
@@ -112,12 +113,69 @@ static void graph_filter_task_clear(struct graph_info *ginfo) | |||
112 | ginfo->filter_enabled = 0; | 113 | ginfo->filter_enabled = 0; |
113 | } | 114 | } |
114 | 115 | ||
116 | gboolean graph_filter_system(struct graph_info *ginfo, const gchar *system) | ||
117 | { | ||
118 | const gchar **sys = &system; | ||
119 | |||
120 | if (ginfo->all_events) | ||
121 | return TRUE; | ||
122 | |||
123 | if (!ginfo->systems) | ||
124 | return FALSE; | ||
125 | |||
126 | sys = bsearch(sys, ginfo->systems, ginfo->systems_size, | ||
127 | sizeof(system), str_cmp); | ||
128 | |||
129 | return sys != NULL; | ||
130 | } | ||
131 | |||
132 | gboolean graph_filter_event(struct graph_info *ginfo, gint event_id) | ||
133 | { | ||
134 | gint *event = &event_id; | ||
135 | |||
136 | if (ginfo->all_events) | ||
137 | return TRUE; | ||
138 | |||
139 | if (!ginfo->event_ids) | ||
140 | return FALSE; | ||
141 | |||
142 | event = bsearch(event, ginfo->event_ids, ginfo->event_ids_size, | ||
143 | sizeof(event_id), id_cmp); | ||
144 | |||
145 | return event != NULL; | ||
146 | } | ||
147 | |||
148 | gboolean graph_filter_on_event(struct graph_info *ginfo, struct record *record) | ||
149 | { | ||
150 | struct event_format *event; | ||
151 | gint event_id; | ||
152 | |||
153 | if (!record) | ||
154 | return TRUE; | ||
155 | |||
156 | if (ginfo->all_events) | ||
157 | return FALSE; | ||
158 | |||
159 | event_id = pevent_data_type(ginfo->pevent, record); | ||
160 | event = pevent_data_event_from_type(ginfo->pevent, event_id); | ||
161 | if (!event) | ||
162 | return TRUE; | ||
163 | |||
164 | if (graph_filter_system(ginfo, event->system)) | ||
165 | return FALSE; | ||
166 | |||
167 | if (graph_filter_event(ginfo, event_id)) | ||
168 | return FALSE; | ||
169 | |||
170 | return TRUE; | ||
171 | } | ||
172 | |||
115 | gboolean graph_filter_on_task(struct graph_info *ginfo, gint pid) | 173 | gboolean graph_filter_on_task(struct graph_info *ginfo, gint pid) |
116 | { | 174 | { |
117 | gboolean filter; | 175 | gboolean filter; |
118 | 176 | ||
119 | filter = FALSE; | 177 | filter = FALSE; |
120 | 178 | ||
121 | if (ginfo->filter_enabled && | 179 | if (ginfo->filter_enabled && |
122 | filter_task_count(ginfo->task_filter) && | 180 | filter_task_count(ginfo->task_filter) && |
123 | !trace_graph_filter_task_find_pid(ginfo, pid)) | 181 | !trace_graph_filter_task_find_pid(ginfo, pid)) |
@@ -1147,7 +1205,7 @@ static void draw_cpu(struct graph_info *ginfo, gint cpu, | |||
1147 | filter = graph_filter_on_task(ginfo, last_pid); | 1205 | filter = graph_filter_on_task(ginfo, last_pid); |
1148 | 1206 | ||
1149 | if (!filter && last_pid) | 1207 | if (!filter && last_pid) |
1150 | 1208 | ||
1151 | gdk_draw_rectangle(ginfo->curr_pixmap, gc, | 1209 | gdk_draw_rectangle(ginfo->curr_pixmap, gc, |
1152 | TRUE, | 1210 | TRUE, |
1153 | last_x, CPU_BOX_TOP(cpu), | 1211 | last_x, CPU_BOX_TOP(cpu), |
@@ -1166,9 +1224,12 @@ static void draw_cpu(struct graph_info *ginfo, gint cpu, | |||
1166 | 1224 | ||
1167 | last_pid = pid; | 1225 | last_pid = pid; |
1168 | 1226 | ||
1169 | if (!filter) | 1227 | if (!filter) { |
1170 | gdk_draw_line(ginfo->curr_pixmap, gc, // ginfo->draw->style->black_gc, | 1228 | filter = graph_filter_on_event(ginfo, record); |
1171 | x, CPU_TOP(cpu), x, CPU_BOTTOM(cpu)); | 1229 | if (!filter) |
1230 | gdk_draw_line(ginfo->curr_pixmap, gc, | ||
1231 | x, CPU_TOP(cpu), x, CPU_BOTTOM(cpu)); | ||
1232 | } | ||
1172 | 1233 | ||
1173 | if (!filter) { | 1234 | if (!filter) { |
1174 | /* Figure out if we can show the text for the previous record */ | 1235 | /* Figure out if we can show the text for the previous record */ |
@@ -1372,6 +1433,82 @@ void trace_graph_select_by_time(struct graph_info *ginfo, guint64 time) | |||
1372 | update_with_backend(ginfo, 0, 0, width, ginfo->draw_height); | 1433 | update_with_backend(ginfo, 0, 0, width, ginfo->draw_height); |
1373 | } | 1434 | } |
1374 | 1435 | ||
1436 | static void graph_free_systems(struct graph_info *ginfo) | ||
1437 | { | ||
1438 | gint i; | ||
1439 | |||
1440 | if (!ginfo->systems) | ||
1441 | return; | ||
1442 | |||
1443 | for (i = 0; ginfo->systems[i]; i++) | ||
1444 | g_free(ginfo->systems[i]); | ||
1445 | |||
1446 | g_free(ginfo->systems); | ||
1447 | ginfo->systems = NULL; | ||
1448 | ginfo->systems_size = 0; | ||
1449 | } | ||
1450 | |||
1451 | static void graph_free_events(struct graph_info *ginfo) | ||
1452 | { | ||
1453 | g_free(ginfo->event_ids); | ||
1454 | ginfo->event_ids = NULL; | ||
1455 | ginfo->event_ids_size = 0; | ||
1456 | } | ||
1457 | |||
1458 | void trace_graph_event_filter_callback(gboolean accept, | ||
1459 | gboolean all_events, | ||
1460 | gchar **systems, | ||
1461 | gint *events, | ||
1462 | gpointer data) | ||
1463 | { | ||
1464 | struct graph_info *ginfo = data; | ||
1465 | gint i; | ||
1466 | |||
1467 | if (!accept) | ||
1468 | return; | ||
1469 | |||
1470 | graph_free_systems(ginfo); | ||
1471 | graph_free_events(ginfo); | ||
1472 | |||
1473 | if (all_events) { | ||
1474 | ginfo->all_events = TRUE; | ||
1475 | redraw_graph(ginfo); | ||
1476 | return; | ||
1477 | } | ||
1478 | |||
1479 | ginfo->all_events = FALSE; | ||
1480 | |||
1481 | if (systems) { | ||
1482 | for (ginfo->systems_size = 0; | ||
1483 | systems[ginfo->systems_size]; | ||
1484 | ginfo->systems_size++) | ||
1485 | ; | ||
1486 | |||
1487 | ginfo->systems = g_new(typeof(*systems), ginfo->systems_size + 1); | ||
1488 | for (i = 0; i < ginfo->systems_size; i++) | ||
1489 | ginfo->systems[i] = g_strdup(systems[i]); | ||
1490 | ginfo->systems[i] = NULL; | ||
1491 | |||
1492 | qsort(ginfo->systems, ginfo->systems_size, sizeof(gchar *), str_cmp); | ||
1493 | } | ||
1494 | |||
1495 | if (events) { | ||
1496 | for (ginfo->event_ids_size = 0; | ||
1497 | events[ginfo->event_ids_size] >= 0; | ||
1498 | ginfo->event_ids_size++) | ||
1499 | ; | ||
1500 | |||
1501 | ginfo->event_ids = g_new(typeof(*events), ginfo->event_ids_size + 1); | ||
1502 | for (i = 0; i < ginfo->event_ids_size; i++) | ||
1503 | ginfo->event_ids[i] = events[i]; | ||
1504 | ginfo->event_ids[i] = -1; | ||
1505 | |||
1506 | qsort(ginfo->event_ids, ginfo->event_ids_size, sizeof(gint), id_cmp); | ||
1507 | } | ||
1508 | |||
1509 | redraw_graph(ginfo); | ||
1510 | } | ||
1511 | |||
1375 | static void redraw_pixmap_backend(struct graph_info *ginfo) | 1512 | static void redraw_pixmap_backend(struct graph_info *ginfo) |
1376 | { | 1513 | { |
1377 | GdkPixmap *old_pix; | 1514 | GdkPixmap *old_pix; |
@@ -1436,6 +1573,9 @@ destroy_event(GtkWidget *widget, gpointer data) | |||
1436 | { | 1573 | { |
1437 | struct graph_info *ginfo = data; | 1574 | struct graph_info *ginfo = data; |
1438 | 1575 | ||
1576 | graph_free_systems(ginfo); | ||
1577 | graph_free_events(ginfo); | ||
1578 | |||
1439 | if (ginfo->test) | 1579 | if (ginfo->test) |
1440 | dprintf(1, "test = %s\n", ginfo->test); | 1580 | dprintf(1, "test = %s\n", ginfo->test); |
1441 | 1581 | ||
@@ -1556,6 +1696,8 @@ trace_graph_create_with_callbacks(struct tracecmd_input *handle, | |||
1556 | ginfo->pevent = tracecmd_get_pevent(handle); | 1696 | ginfo->pevent = tracecmd_get_pevent(handle); |
1557 | ginfo->cpus = tracecmd_cpus(handle); | 1697 | ginfo->cpus = tracecmd_cpus(handle); |
1558 | 1698 | ||
1699 | ginfo->all_events = TRUE; | ||
1700 | |||
1559 | ginfo->callbacks = cbs; | 1701 | ginfo->callbacks = cbs; |
1560 | 1702 | ||
1561 | ginfo->start_time = -1ULL; | 1703 | ginfo->start_time = -1ULL; |
diff --git a/trace-graph.h b/trace-graph.h index 61d17db..db15c50 100644 --- a/trace-graph.h +++ b/trace-graph.h | |||
@@ -48,8 +48,14 @@ struct graph_info { | |||
48 | 48 | ||
49 | struct graph_callbacks *callbacks; /* call back hooks for changes to graph */ | 49 | struct graph_callbacks *callbacks; /* call back hooks for changes to graph */ |
50 | 50 | ||
51 | int filter_enabled; | 51 | gboolean filter_enabled; |
52 | int filter_available; | 52 | gboolean filter_available; |
53 | |||
54 | gboolean all_events; /* all events enabled */ | ||
55 | gchar **systems; /* event systems to filter on */ | ||
56 | gint *event_ids; /* events to filter on */ | ||
57 | gint systems_size; | ||
58 | gint event_ids_size; | ||
53 | 59 | ||
54 | struct filter_task *task_filter; | 60 | struct filter_task *task_filter; |
55 | gint filter_task_selected; | 61 | gint filter_task_selected; |
@@ -76,6 +82,12 @@ trace_graph_create_with_callbacks(struct tracecmd_input *handle, | |||
76 | struct graph_callbacks *cbs); | 82 | struct graph_callbacks *cbs); |
77 | void trace_graph_select_by_time(struct graph_info *ginfo, guint64 time); | 83 | void trace_graph_select_by_time(struct graph_info *ginfo, guint64 time); |
78 | 84 | ||
85 | void trace_graph_event_filter_callback(gboolean accept, | ||
86 | gboolean all_events, | ||
87 | gchar **systems, | ||
88 | gint *events, | ||
89 | gpointer data); | ||
90 | |||
79 | static inline GtkWidget *trace_graph_get_draw(struct graph_info *ginfo) | 91 | static inline GtkWidget *trace_graph_get_draw(struct graph_info *ginfo) |
80 | { | 92 | { |
81 | return ginfo->draw; | 93 | return ginfo->draw; |
diff --git a/trace-hash.c b/trace-hash.c index a41b2ce..d8cd42f 100644 --- a/trace-hash.c +++ b/trace-hash.c | |||
@@ -159,24 +159,3 @@ struct filter_task *filter_task_hash_copy(struct filter_task *hash) | |||
159 | 159 | ||
160 | return new_hash; | 160 | return new_hash; |
161 | } | 161 | } |
162 | |||
163 | |||
164 | int str_cmp(const void *a, const void *b) | ||
165 | { | ||
166 | char * const * sa = a; | ||
167 | char * const * sb = b; | ||
168 | |||
169 | return strcmp(*sa, *sb); | ||
170 | } | ||
171 | |||
172 | int id_cmp(const void *a, const void *b) | ||
173 | { | ||
174 | const gint *ia = a; | ||
175 | const gint *ib = b; | ||
176 | |||
177 | if (*ia > *ib) | ||
178 | return 1; | ||
179 | if (*ia < *ib) | ||
180 | return -1; | ||
181 | return 0; | ||
182 | } | ||
diff --git a/trace-hash.h b/trace-hash.h index 04543f7..9948138 100644 --- a/trace-hash.h +++ b/trace-hash.h | |||
@@ -29,9 +29,4 @@ static inline gint filter_task_count(struct filter_task *hash) | |||
29 | return hash->count; | 29 | return hash->count; |
30 | } | 30 | } |
31 | 31 | ||
32 | /* put here because there's no other place */ | ||
33 | |||
34 | int str_cmp(const void *a, const void *b); | ||
35 | int id_cmp(const void *a, const void *b); | ||
36 | |||
37 | #endif /* _TRACE_HASH_H */ | 32 | #endif /* _TRACE_HASH_H */ |
diff --git a/trace-view-store.c b/trace-view-store.c index cc6b865..3ea7e3b 100644 --- a/trace-view-store.c +++ b/trace-view-store.c | |||
@@ -3,6 +3,7 @@ | |||
3 | #include <string.h> | 3 | #include <string.h> |
4 | 4 | ||
5 | #include "cpu.h" | 5 | #include "cpu.h" |
6 | #include "trace-filter.h" | ||
6 | 7 | ||
7 | /* boring declarations of local functions */ | 8 | /* boring declarations of local functions */ |
8 | 9 | ||
diff --git a/trace-view.h b/trace-view.h index 44cf0d0..2b34f23 100644 --- a/trace-view.h +++ b/trace-view.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define _TRACE_VIEW_H | 2 | #define _TRACE_VIEW_H |
3 | 3 | ||
4 | #include "trace-view-store.h" | 4 | #include "trace-view-store.h" |
5 | #include "trace-filter.h" | ||
5 | 6 | ||
6 | void | 7 | void |
7 | trace_view_load(GtkWidget *view, struct tracecmd_input *handle, | 8 | trace_view_load(GtkWidget *view, struct tracecmd_input *handle, |
@@ -12,57 +13,6 @@ void trace_view(int argc, char **argv); | |||
12 | void trace_view_update_task_filter(GtkWidget *treeview, struct filter_task *filter); | 13 | void trace_view_update_task_filter(GtkWidget *treeview, struct filter_task *filter); |
13 | void trace_view_make_selection_visible(GtkWidget *treeview); | 14 | void trace_view_make_selection_visible(GtkWidget *treeview); |
14 | 15 | ||
15 | struct event_filter_list { | ||
16 | struct event_filter_list *next; | ||
17 | struct event *event; | ||
18 | }; | ||
19 | |||
20 | /** | ||
21 | * trace_filter_event_cb_func - callback type for event dialog | ||
22 | * @accept: TRUE if the accept button was pressed, otherwise FALSE | ||
23 | * @all_events: TRUE if "All Events" was checked | ||
24 | * @systems: NULL or a string array of systems terminated with NULL | ||
25 | * @events: NULL or a int array of event ids terminated with -1 | ||
26 | * @data: The data given passed in to the event dialog function | ||
27 | * | ||
28 | * If @accept is FALSE then @all_events, @systems, and @events | ||
29 | * should be ignored. @data is still valid. | ||
30 | * | ||
31 | * If @all_events is TRUE then @systems and @events should be ignored. | ||
32 | */ | ||
33 | typedef void (*trace_filter_event_cb_func)(gboolean accept, | ||
34 | gboolean all_events, | ||
35 | char **systems, | ||
36 | gint *events, | ||
37 | gpointer data); | ||
38 | |||
39 | void trace_filter_event_dialog(struct tracecmd_input *handle, | ||
40 | gboolean all_events, | ||
41 | gchar **systems, | ||
42 | gint *events, | ||
43 | trace_filter_event_cb_func func, | ||
44 | gpointer data); | ||
45 | |||
46 | /** | ||
47 | * trace_filter_cpu_cb_func - callback type for CPU dialog | ||
48 | * @accept: TRUE if the accept button was pressed, otherwise FALSE | ||
49 | * @all_cpus: TRUE if "All CPUS" was checked | ||
50 | * @selected_cpus: NULL or a cpu_mask with the cpus that were checked set. | ||
51 | * @data: The data given passed in to the CPU dialog function | ||
52 | * | ||
53 | * If @accept is FALSE then @all_cpus and @selected_cpus should be ignored. | ||
54 | * @data is still valid. | ||
55 | * | ||
56 | * If @all_cpus is TRUE then @selected_cpus should be ignored. | ||
57 | */ | ||
58 | typedef void (*trace_filter_cpu_cb_func)(gboolean accept, | ||
59 | gboolean all_cpus, | ||
60 | guint64 *selected_cpus, | ||
61 | gpointer data); | ||
62 | |||
63 | void trace_filter_cpu_dialog(gboolean all_cpus, guint64 *cpu_mask_selected, gint cpus, | ||
64 | trace_filter_cpu_cb_func func, gpointer data); | ||
65 | |||
66 | void trace_view_select(GtkWidget *treeview, guint64 time); | 16 | void trace_view_select(GtkWidget *treeview, guint64 time); |
67 | 17 | ||
68 | void trace_view_event_filter_callback(gboolean accept, | 18 | void trace_view_event_filter_callback(gboolean accept, |