diff options
Diffstat (limited to 'trace-view-store.c')
-rw-r--r-- | trace-view-store.c | 75 |
1 files changed, 63 insertions, 12 deletions
diff --git a/trace-view-store.c b/trace-view-store.c index 3ea7e3b..14d8b17 100644 --- a/trace-view-store.c +++ b/trace-view-store.c | |||
@@ -1249,7 +1249,17 @@ gint get_next_pid(TraceViewStore *store, struct pevent *pevent, struct record *r | |||
1249 | return val; | 1249 | return val; |
1250 | } | 1250 | } |
1251 | 1251 | ||
1252 | void trace_view_store_filter_tasks(TraceViewStore *store, struct filter_task *filter) | 1252 | static gboolean show_task(TraceViewStore *store, gint pid) |
1253 | { | ||
1254 | return (!store->task_filter || | ||
1255 | !filter_task_count(store->task_filter) || | ||
1256 | filter_task_find_pid(store->task_filter, pid)) && | ||
1257 | (!store->hide_tasks || | ||
1258 | !filter_task_count(store->hide_tasks) || | ||
1259 | !filter_task_find_pid(store->hide_tasks, pid)); | ||
1260 | } | ||
1261 | |||
1262 | static void update_filter_tasks(TraceViewStore *store) | ||
1253 | { | 1263 | { |
1254 | struct tracecmd_input *handle; | 1264 | struct tracecmd_input *handle; |
1255 | struct event_format *event; | 1265 | struct event_format *event; |
@@ -1261,14 +1271,6 @@ void trace_view_store_filter_tasks(TraceViewStore *store, struct filter_task *fi | |||
1261 | gint cpu; | 1271 | gint cpu; |
1262 | gint i; | 1272 | gint i; |
1263 | 1273 | ||
1264 | g_return_if_fail (TRACE_VIEW_IS_LIST (store)); | ||
1265 | |||
1266 | /* We may pass in the store->task_filter. Don't free it if we do */ | ||
1267 | if (store->task_filter && store->task_filter != filter) | ||
1268 | filter_task_hash_free(store->task_filter); | ||
1269 | |||
1270 | store->task_filter = filter_task_hash_copy(filter); | ||
1271 | |||
1272 | handle = store->handle; | 1274 | handle = store->handle; |
1273 | pevent = tracecmd_get_pevent(store->handle); | 1275 | pevent = tracecmd_get_pevent(store->handle); |
1274 | 1276 | ||
@@ -1305,7 +1307,7 @@ void trace_view_store_filter_tasks(TraceViewStore *store, struct filter_task *fi | |||
1305 | } | 1307 | } |
1306 | 1308 | ||
1307 | pid = pevent_data_pid(pevent, record); | 1309 | pid = pevent_data_pid(pevent, record); |
1308 | if (!filter || filter_task_find_pid(filter, pid)) | 1310 | if (show_task(store, pid)) |
1309 | store->cpu_list[cpu][i].visible = 1; | 1311 | store->cpu_list[cpu][i].visible = 1; |
1310 | else { | 1312 | else { |
1311 | if (store->sched_switch_next_field && | 1313 | if (store->sched_switch_next_field && |
@@ -1313,7 +1315,7 @@ void trace_view_store_filter_tasks(TraceViewStore *store, struct filter_task *fi | |||
1313 | store->sched_switch_event->id) { | 1315 | store->sched_switch_event->id) { |
1314 | /* show sched switch to task */ | 1316 | /* show sched switch to task */ |
1315 | pid = get_next_pid(store, pevent, record); | 1317 | pid = get_next_pid(store, pevent, record); |
1316 | if (filter_task_find_pid(filter, pid)) | 1318 | if (show_task(store, pid)) |
1317 | store->cpu_list[cpu][i].visible = 1; | 1319 | store->cpu_list[cpu][i].visible = 1; |
1318 | else | 1320 | else |
1319 | store->cpu_list[cpu][i].visible = 0; | 1321 | store->cpu_list[cpu][i].visible = 0; |
@@ -1331,11 +1333,60 @@ void trace_view_store_filter_tasks(TraceViewStore *store, struct filter_task *fi | |||
1331 | merge_sort_rows_ts(store); | 1333 | merge_sort_rows_ts(store); |
1332 | } | 1334 | } |
1333 | 1335 | ||
1336 | void trace_view_store_filter_tasks(TraceViewStore *store, struct filter_task *filter) | ||
1337 | { | ||
1338 | g_return_if_fail (TRACE_VIEW_IS_LIST (store)); | ||
1339 | |||
1340 | /* We may pass in the store->task_filter. Don't free it if we do */ | ||
1341 | if (store->task_filter && store->task_filter != filter) | ||
1342 | filter_task_hash_free(store->task_filter); | ||
1343 | |||
1344 | if (store->task_filter != filter) | ||
1345 | store->task_filter = filter_task_hash_copy(filter); | ||
1346 | |||
1347 | update_filter_tasks(store); | ||
1348 | } | ||
1349 | |||
1350 | void trace_view_store_hide_tasks(TraceViewStore *store, struct filter_task *filter) | ||
1351 | { | ||
1352 | g_return_if_fail (TRACE_VIEW_IS_LIST (store)); | ||
1353 | |||
1354 | /* We may pass in the store->task_filter. Don't free it if we do */ | ||
1355 | if (store->hide_tasks && store->hide_tasks != filter) | ||
1356 | filter_task_hash_free(store->hide_tasks); | ||
1357 | |||
1358 | if (store->hide_tasks != filter) | ||
1359 | store->hide_tasks = filter_task_hash_copy(filter); | ||
1360 | |||
1361 | update_filter_tasks(store); | ||
1362 | } | ||
1363 | |||
1334 | void trace_view_store_update_filter(TraceViewStore *store) | 1364 | void trace_view_store_update_filter(TraceViewStore *store) |
1335 | { | 1365 | { |
1336 | g_return_if_fail (TRACE_VIEW_IS_LIST (store)); | 1366 | g_return_if_fail (TRACE_VIEW_IS_LIST (store)); |
1337 | 1367 | ||
1338 | trace_view_store_filter_tasks(store, store->task_filter); | 1368 | update_filter_tasks(store); |
1369 | } | ||
1370 | |||
1371 | void trace_view_store_assign_filters(TraceViewStore *store, | ||
1372 | struct filter_task *task_filter, | ||
1373 | struct filter_task *hide_tasks) | ||
1374 | { | ||
1375 | g_return_if_fail (TRACE_VIEW_IS_LIST (store)); | ||
1376 | |||
1377 | /* We may pass in the store->task_filter. Don't free it if we do */ | ||
1378 | if (store->task_filter && store->task_filter != task_filter) | ||
1379 | filter_task_hash_free(store->task_filter); | ||
1380 | |||
1381 | if (store->hide_tasks && store->hide_tasks != hide_tasks) | ||
1382 | filter_task_hash_free(store->hide_tasks); | ||
1383 | |||
1384 | if (store->hide_tasks != hide_tasks) | ||
1385 | store->hide_tasks = filter_task_hash_copy(hide_tasks); | ||
1386 | |||
1387 | if (store->task_filter != task_filter) | ||
1388 | store->task_filter = filter_task_hash_copy(task_filter); | ||
1389 | |||
1339 | } | 1390 | } |
1340 | 1391 | ||
1341 | 1392 | ||