aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel-shark.c129
-rw-r--r--trace-filter.c6
-rw-r--r--trace-filter.h2
-rw-r--r--trace-graph-main.c8
-rw-r--r--trace-view-main.c8
-rw-r--r--trace-xml.c16
-rw-r--r--trace-xml.h2
7 files changed, 132 insertions, 39 deletions
diff --git a/kernel-shark.c b/kernel-shark.c
index e0ab1ed..91ecf82 100644
--- a/kernel-shark.c
+++ b/kernel-shark.c
@@ -223,6 +223,38 @@ static void update_title(GtkWidget *window, const gchar *file)
223 g_free(str); 223 g_free(str);
224} 224}
225 225
226static void unsync_task_filters(struct shark_info *info)
227{
228 info->sync_task_filters = 0;
229 gtk_menu_item_set_label(GTK_MENU_ITEM(info->task_sync_menu),
230 "Sync Graph and List Task Filters");
231
232 gtk_menu_item_set_label(GTK_MENU_ITEM(info->graph_task_menu),
233 "graph tasks");
234 gtk_menu_item_set_label(GTK_MENU_ITEM(info->graph_hide_task_menu),
235 "graph hide tasks");
236 gtk_widget_show(info->list_task_menu);
237 gtk_widget_show(info->list_hide_task_menu);
238
239 /* The list now uses its own hash */
240 info->list_task_filter = filter_task_hash_copy(info->ginfo->task_filter);
241 info->list_hide_tasks = filter_task_hash_copy(info->ginfo->hide_tasks);
242}
243
244static void unsync_event_filters(struct shark_info *info)
245{
246 info->sync_event_filters = 0;
247 gtk_menu_item_set_label(GTK_MENU_ITEM(info->events_sync_menu),
248 "Sync Graph and List Event Filters");
249
250 gtk_menu_item_set_label(GTK_MENU_ITEM(info->graph_events_menu),
251 "graph events");
252 gtk_menu_item_set_label(GTK_MENU_ITEM(info->graph_adv_events_menu),
253 "graph advanced events");
254 gtk_widget_show(info->list_events_menu);
255 gtk_widget_show(info->list_adv_events_menu);
256}
257
226static void 258static void
227/* Callback for the clicked signal of the Load button */ 259/* Callback for the clicked signal of the Load button */
228load_clicked (gpointer data) 260load_clicked (gpointer data)
@@ -254,24 +286,64 @@ load_filters_clicked (gpointer data)
254 struct graph_info *ginfo = info->ginfo; 286 struct graph_info *ginfo = info->ginfo;
255 GtkTreeView *trace_tree = GTK_TREE_VIEW(info->treeview); 287 GtkTreeView *trace_tree = GTK_TREE_VIEW(info->treeview);
256 struct tracecmd_xml_handle *handle; 288 struct tracecmd_xml_handle *handle;
289 struct filter_task *task_filter;
290 struct filter_task *hide_tasks;
257 gchar *filename; 291 gchar *filename;
292 int ret;
258 293
259 filename = trace_get_file_dialog("Load Filters"); 294 filename = trace_get_file_dialog("Load Filters");
260 if (!filename) 295 if (!filename)
261 return; 296 return;
262 297
263 handle = tracecmd_xml_open(filename); 298 handle = tracecmd_xml_open(filename);
264 if (!handle) 299 if (!handle) {
265 warning("Could not open %s", filename); 300 warning("Could not open %s", filename);
266 g_free(filename); 301 goto out;
302 }
267 303
268 trace_filter_load_filters(handle, ginfo->task_filter, 304 /* Unsync the list and graph filters */
269 ginfo->hide_tasks); 305 if (info->sync_task_filters)
306 unsync_task_filters(info);
307 if (info->sync_event_filters)
308 unsync_event_filters(info);
309
310 ret = tracecmd_xml_system_exists(handle,
311 "GraphTaskFilter");
312 if (ret) {
313 filter_task_clear(ginfo->task_filter);
314 filter_task_clear(ginfo->hide_tasks);
315
316 trace_filter_load_filters(handle,
317 "GraphTaskFilter",
318 ginfo->task_filter,
319 ginfo->hide_tasks);
320 trace_graph_refresh_filters(ginfo);
321 }
322
323 ret = tracecmd_xml_system_exists(handle,
324 "ListTaskFilter");
325 if (ret) {
326
327 task_filter = info->list_task_filter;
328 hide_tasks = info->list_hide_tasks;
329 filter_task_clear(task_filter);
330 filter_task_clear(hide_tasks);
331
332 trace_filter_load_filters(handle,
333 "ListTaskFilter",
334 task_filter,
335 hide_tasks);
336 update_tree_view_filters(info, task_filter, hide_tasks);
337 }
270 338
271 trace_view_load_filters(handle, trace_tree);
272 trace_graph_load_filters(ginfo, handle); 339 trace_graph_load_filters(ginfo, handle);
340 ret = trace_view_load_filters(handle, trace_tree);
273 341
274 tracecmd_xml_close(handle); 342 tracecmd_xml_close(handle);
343
344 out:
345 g_free(filename);
346
275} 347}
276 348
277/* Callback for the clicked signal of the Save Filters button */ 349/* Callback for the clicked signal of the Save Filters button */
@@ -282,6 +354,8 @@ save_filters_clicked (gpointer data)
282 struct graph_info *ginfo = info->ginfo; 354 struct graph_info *ginfo = info->ginfo;
283 struct tracecmd_xml_handle *handle; 355 struct tracecmd_xml_handle *handle;
284 GtkTreeView *trace_tree = GTK_TREE_VIEW(info->treeview); 356 GtkTreeView *trace_tree = GTK_TREE_VIEW(info->treeview);
357 struct filter_task *task_filter;
358 struct filter_task *hide_tasks;
285 gchar *filename; 359 gchar *filename;
286 360
287 filename = trace_get_file_dialog("Save Filters"); 361 filename = trace_get_file_dialog("Save Filters");
@@ -294,12 +368,25 @@ save_filters_clicked (gpointer data)
294 g_free(filename); 368 g_free(filename);
295 369
296 trace_view_save_filters(handle, trace_tree); 370 trace_view_save_filters(handle, trace_tree);
297
298 trace_graph_save_filters(ginfo, handle); 371 trace_graph_save_filters(ginfo, handle);
299 372
300 trace_filter_save_filters(handle, ginfo->task_filter, 373 trace_filter_save_filters(handle,
374 "GraphTaskFilter",
375 ginfo->task_filter,
301 ginfo->hide_tasks); 376 ginfo->hide_tasks);
302 377
378 if (info->sync_task_filters) {
379 task_filter = ginfo->task_filter;
380 hide_tasks = ginfo->hide_tasks;
381 } else {
382 task_filter = info->list_task_filter;
383 hide_tasks = info->list_hide_tasks;
384 }
385
386 trace_filter_save_filters(handle,
387 "ListTaskFilter",
388 task_filter, hide_tasks);
389
303 tracecmd_xml_close(handle); 390 tracecmd_xml_close(handle);
304} 391}
305 392
@@ -345,20 +432,7 @@ sync_task_filter_clicked (GtkWidget *subitem, gpointer data)
345 if (info->sync_task_filters) { 432 if (info->sync_task_filters) {
346 /* Separate the List and Graph filters */ 433 /* Separate the List and Graph filters */
347 434
348 info->sync_task_filters = 0; 435 unsync_task_filters(info);
349 gtk_menu_item_set_label(GTK_MENU_ITEM(info->task_sync_menu),
350 "Sync Graph and List Task Filters");
351
352 gtk_menu_item_set_label(GTK_MENU_ITEM(info->graph_task_menu),
353 "graph tasks");
354 gtk_menu_item_set_label(GTK_MENU_ITEM(info->graph_hide_task_menu),
355 "graph hide tasks");
356 gtk_widget_show(info->list_task_menu);
357 gtk_widget_show(info->list_hide_task_menu);
358
359 /* The list now uses its own hash */
360 info->list_task_filter = filter_task_hash_copy(info->ginfo->task_filter);
361 info->list_hide_tasks = filter_task_hash_copy(info->ginfo->hide_tasks);
362 return; 436 return;
363 } 437 }
364 438
@@ -442,18 +516,7 @@ sync_events_filter_clicked (GtkWidget *subitem, gpointer data)
442 516
443 if (info->sync_event_filters) { 517 if (info->sync_event_filters) {
444 /* Separate the List and Graph filters */ 518 /* Separate the List and Graph filters */
445 519 unsync_event_filters(info);
446 info->sync_event_filters = 0;
447 gtk_menu_item_set_label(GTK_MENU_ITEM(info->events_sync_menu),
448 "Sync Graph and List Event Filters");
449
450 gtk_menu_item_set_label(GTK_MENU_ITEM(info->graph_events_menu),
451 "graph events");
452 gtk_menu_item_set_label(GTK_MENU_ITEM(info->graph_adv_events_menu),
453 "graph advanced events");
454 gtk_widget_show(info->list_events_menu);
455 gtk_widget_show(info->list_adv_events_menu);
456
457 return; 520 return;
458 } 521 }
459 522
diff --git a/trace-filter.c b/trace-filter.c
index 2cc0629..b8fc76f 100644
--- a/trace-filter.c
+++ b/trace-filter.c
@@ -2196,6 +2196,7 @@ int trace_filter_load_task_filter(struct filter_task *filter,
2196} 2196}
2197 2197
2198int trace_filter_load_filters(struct tracecmd_xml_handle *handle, 2198int trace_filter_load_filters(struct tracecmd_xml_handle *handle,
2199 const char *system_name,
2199 struct filter_task *task_filter, 2200 struct filter_task *task_filter,
2200 struct filter_task *hide_tasks) 2201 struct filter_task *hide_tasks)
2201{ 2202{
@@ -2203,7 +2204,7 @@ int trace_filter_load_filters(struct tracecmd_xml_handle *handle,
2203 struct tracecmd_xml_system_node *syschild; 2204 struct tracecmd_xml_system_node *syschild;
2204 const char *name; 2205 const char *name;
2205 2206
2206 system = tracecmd_xml_find_system(handle, "TraceFilter"); 2207 system = tracecmd_xml_find_system(handle, system_name);
2207 if (!system) 2208 if (!system)
2208 return -1; 2209 return -1;
2209 2210
@@ -2234,11 +2235,12 @@ int trace_filter_load_filters(struct tracecmd_xml_handle *handle,
2234} 2235}
2235 2236
2236int trace_filter_save_filters(struct tracecmd_xml_handle *handle, 2237int trace_filter_save_filters(struct tracecmd_xml_handle *handle,
2238 const char *system_name,
2237 struct filter_task *task_filter, 2239 struct filter_task *task_filter,
2238 struct filter_task *hide_tasks) 2240 struct filter_task *hide_tasks)
2239{ 2241{
2240 2242
2241 tracecmd_xml_start_system(handle, "TraceFilter"); 2243 tracecmd_xml_start_system(handle, system_name);
2242 2244
2243 if (task_filter && filter_task_count(task_filter)) { 2245 if (task_filter && filter_task_count(task_filter)) {
2244 tracecmd_xml_start_sub_system(handle, "TaskFilter"); 2246 tracecmd_xml_start_sub_system(handle, "TaskFilter");
diff --git a/trace-filter.h b/trace-filter.h
index e0f9f4a..1800471 100644
--- a/trace-filter.h
+++ b/trace-filter.h
@@ -149,9 +149,11 @@ int trace_filter_load_task_filter(struct filter_task *filter,
149 struct tracecmd_xml_handle *handle, 149 struct tracecmd_xml_handle *handle,
150 struct tracecmd_xml_system_node *node); 150 struct tracecmd_xml_system_node *node);
151int trace_filter_load_filters(struct tracecmd_xml_handle *handle, 151int trace_filter_load_filters(struct tracecmd_xml_handle *handle,
152 const char *system_name,
152 struct filter_task *task_filter, 153 struct filter_task *task_filter,
153 struct filter_task *hide_tasks); 154 struct filter_task *hide_tasks);
154int trace_filter_save_filters(struct tracecmd_xml_handle *handle, 155int trace_filter_save_filters(struct tracecmd_xml_handle *handle,
156 const char *system_name,
155 struct filter_task *task_filter, 157 struct filter_task *task_filter,
156 struct filter_task *hide_tasks); 158 struct filter_task *hide_tasks);
157 159
diff --git a/trace-graph-main.c b/trace-graph-main.c
index 2ba9447..b4f05fb 100644
--- a/trace-graph-main.c
+++ b/trace-graph-main.c
@@ -171,7 +171,9 @@ load_filters_clicked (gpointer data)
171 warning("Could not open %s", filename); 171 warning("Could not open %s", filename);
172 g_free(filename); 172 g_free(filename);
173 173
174 trace_filter_load_filters(handle, ginfo->task_filter, 174 trace_filter_load_filters(handle,
175 "GraphTaskFilter",
176 ginfo->task_filter,
175 ginfo->hide_tasks); 177 ginfo->hide_tasks);
176 178
177 trace_graph_load_filters(ginfo, handle); 179 trace_graph_load_filters(ginfo, handle);
@@ -196,7 +198,9 @@ save_filters_clicked (gpointer data)
196 warning("Could not create %s", filename); 198 warning("Could not create %s", filename);
197 g_free(filename); 199 g_free(filename);
198 200
199 trace_filter_save_filters(handle, ginfo->task_filter, 201 trace_filter_save_filters(handle,
202 "GraphTaskFilter",
203 ginfo->task_filter,
200 ginfo->hide_tasks); 204 ginfo->hide_tasks);
201 205
202 trace_graph_save_filters(ginfo, handle); 206 trace_graph_save_filters(ginfo, handle);
diff --git a/trace-view-main.c b/trace-view-main.c
index 8fa9aa6..59d6838 100644
--- a/trace-view-main.c
+++ b/trace-view-main.c
@@ -102,7 +102,9 @@ load_filters_clicked (gpointer data)
102 } 102 }
103 g_free(filename); 103 g_free(filename);
104 104
105 trace_filter_load_filters(handle, info->task_filter, 105 trace_filter_load_filters(handle,
106 "ListTaskFilter",
107 info->task_filter,
106 info->hide_tasks); 108 info->hide_tasks);
107 109
108 trace_view_load_filters(handle, trace_tree); 110 trace_view_load_filters(handle, trace_tree);
@@ -128,7 +130,9 @@ save_filters_clicked (gpointer data)
128 warning("Could not create %s", filename); 130 warning("Could not create %s", filename);
129 g_free(filename); 131 g_free(filename);
130 132
131 trace_filter_save_filters(handle, info->task_filter, info->hide_tasks); 133 trace_filter_save_filters(handle,
134 "ListTaskFilter",
135 info->task_filter, info->hide_tasks);
132 trace_view_save_filters(handle, trace_tree); 136 trace_view_save_filters(handle, trace_tree);
133 137
134 tracecmd_xml_close(handle); 138 tracecmd_xml_close(handle);
diff --git a/trace-xml.c b/trace-xml.c
index 62473fb..bef1f9f 100644
--- a/trace-xml.c
+++ b/trace-xml.c
@@ -230,3 +230,19 @@ void tracecmd_xml_free_system(struct tracecmd_xml_system *system)
230 xmlXPathFreeObject(system->result); 230 xmlXPathFreeObject(system->result);
231 free(system); 231 free(system);
232} 232}
233
234int tracecmd_xml_system_exists(struct tracecmd_xml_handle *handle,
235 const char *system)
236{
237 struct tracecmd_xml_system *sys;
238 int exists = 0;
239
240 sys = tracecmd_xml_find_system(handle, system);
241 if (sys) {
242 exists = 1;
243 tracecmd_xml_free_system(sys);
244 }
245
246 return exists;
247}
248
diff --git a/trace-xml.h b/trace-xml.h
index f84907d..d1f62b0 100644
--- a/trace-xml.h
+++ b/trace-xml.h
@@ -56,5 +56,7 @@ struct tracecmd_xml_system_node *
56tracecmd_xml_node_next(struct tracecmd_xml_system_node *tnode); 56tracecmd_xml_node_next(struct tracecmd_xml_system_node *tnode);
57const char *tracecmd_xml_node_value(struct tracecmd_xml_handle *handle, 57const char *tracecmd_xml_node_value(struct tracecmd_xml_handle *handle,
58 struct tracecmd_xml_system_node *tnode); 58 struct tracecmd_xml_system_node *tnode);
59int tracecmd_xml_system_exists(struct tracecmd_xml_handle *handle,
60 const char *system);
59 61
60#endif /* __TRACE_XML_H */ 62#endif /* __TRACE_XML_H */