aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2010-04-05 20:56:05 -0400
committerSteven Rostedt <rostedt@goodmis.org>2010-04-09 11:56:18 -0400
commit64be78aa61dfda0c5fdf5c7ccfc2d9a93ba52aa5 (patch)
treef6248d42260462c68ee79b19d63c3a4f8470cf00
parent81b404df1d425f146527dc3da253365071e68bea (diff)
trace-view: Add save and load of task filters
Include saving of the task filters to the filter file as well as the ability to load them. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--trace-filter.c43
-rw-r--r--trace-filter.h3
-rw-r--r--trace-hash.c27
-rw-r--r--trace-hash.h1
-rw-r--r--trace-view-main.c6
-rw-r--r--trace-view.c56
-rw-r--r--trace-view.h8
7 files changed, 96 insertions, 48 deletions
diff --git a/trace-filter.c b/trace-filter.c
index efdb5fa..b6035ad 100644
--- a/trace-filter.c
+++ b/trace-filter.c
@@ -2207,6 +2207,21 @@ int trace_filter_save_events(struct tracecmd_xml_handle *handle,
2207int trace_filter_save_tasks(struct tracecmd_xml_handle *handle, 2207int trace_filter_save_tasks(struct tracecmd_xml_handle *handle,
2208 struct filter_task *filter) 2208 struct filter_task *filter)
2209{ 2209{
2210 char buffer[100];
2211 int *pids;
2212 int i;
2213
2214 pids = filter_task_pids(filter);
2215 if (!pids)
2216 return -1;
2217
2218 for (i = 0; pids[i] >= 0; i++) {
2219 snprintf(buffer, 100, "%d", pids[i]);
2220 tracecmd_xml_write_element(handle, "Task", buffer);
2221 }
2222
2223 free(pids);
2224
2210 return 0; 2225 return 0;
2211} 2226}
2212 2227
@@ -2284,3 +2299,31 @@ int trace_filter_load_events(struct event_filter *event_filter,
2284 2299
2285 return 0; 2300 return 0;
2286} 2301}
2302
2303int trace_filter_load_task_filter(struct filter_task *filter,
2304 struct tracecmd_xml_handle *handle,
2305 struct tracecmd_xml_system_node *node)
2306{
2307 const char *name;
2308 const char *task;
2309 int pid;
2310
2311 if (!filter)
2312 return 0;
2313
2314 node = tracecmd_xml_node_child(node);
2315
2316 while (node) {
2317 name = tracecmd_xml_node_type(node);
2318
2319 if (strcmp(name, "Task") == 0) {
2320 task = tracecmd_xml_node_value(handle, node);
2321 pid = atoi(task);
2322 if (!filter_task_find_pid(filter, pid))
2323 filter_task_add_pid(filter, pid);
2324 }
2325 node = tracecmd_xml_node_next(node);
2326 }
2327
2328 return 0;
2329}
diff --git a/trace-filter.h b/trace-filter.h
index 915b174..fd60bce 100644
--- a/trace-filter.h
+++ b/trace-filter.h
@@ -145,6 +145,9 @@ int trace_filter_save_tasks(struct tracecmd_xml_handle *handle,
145int trace_filter_load_events(struct event_filter *event_filter, 145int trace_filter_load_events(struct event_filter *event_filter,
146 struct tracecmd_xml_handle *handle, 146 struct tracecmd_xml_handle *handle,
147 struct tracecmd_xml_system_node *node); 147 struct tracecmd_xml_system_node *node);
148int trace_filter_load_task_filter(struct filter_task *filter,
149 struct tracecmd_xml_handle *handle,
150 struct tracecmd_xml_system_node *node);
148 151
149/* put here because there's no other place */ 152/* put here because there's no other place */
150 153
diff --git a/trace-hash.c b/trace-hash.c
index 1197913..3349715 100644
--- a/trace-hash.c
+++ b/trace-hash.c
@@ -19,6 +19,7 @@
19 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 19 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20 */ 20 */
21#include <stdio.h> 21#include <stdio.h>
22#include <stdlib.h>
22#include <string.h> 23#include <string.h>
23#include <stdarg.h> 24#include <stdarg.h>
24 25
@@ -155,3 +156,29 @@ struct filter_task *filter_task_hash_copy(struct filter_task *hash)
155 156
156 return new_hash; 157 return new_hash;
157} 158}
159
160int *filter_task_pids(struct filter_task *hash)
161{
162 struct filter_task_item *task;
163 int *pids;
164 int count = 0;
165 int i;
166
167 if (!hash->count)
168 return NULL;
169
170 pids = malloc(sizeof(*pids) * (hash->count + 1));
171 if (!pids)
172 return NULL;
173
174 for (i = 0; i < FILTER_TASK_HASH_SIZE; i++) {
175 task = hash->hash[i];
176 while (task) {
177 pids[count++] = task->pid;
178 task = task->next;
179 }
180 }
181 pids[count] = -1;
182
183 return pids;
184}
diff --git a/trace-hash.h b/trace-hash.h
index 1aaa828..29088e7 100644
--- a/trace-hash.h
+++ b/trace-hash.h
@@ -42,6 +42,7 @@ void filter_task_clear(struct filter_task *hash);
42struct filter_task *filter_task_hash_alloc(void); 42struct filter_task *filter_task_hash_alloc(void);
43void filter_task_hash_free(struct filter_task *hash); 43void filter_task_hash_free(struct filter_task *hash);
44struct filter_task *filter_task_hash_copy(struct filter_task *hash); 44struct filter_task *filter_task_hash_copy(struct filter_task *hash);
45int *filter_task_pids(struct filter_task *hash);
45 46
46static inline gint filter_task_count(struct filter_task *hash) 47static inline gint filter_task_count(struct filter_task *hash)
47{ 48{
diff --git a/trace-view-main.c b/trace-view-main.c
index 74922fb..af9dc5d 100644
--- a/trace-view-main.c
+++ b/trace-view-main.c
@@ -97,7 +97,8 @@ load_filters_clicked (gpointer data)
97 warning("Could not open %s", filename); 97 warning("Could not open %s", filename);
98 g_free(filename); 98 g_free(filename);
99 99
100 trace_view_load_filters(handle, trace_tree); 100 trace_view_load_filters(handle, trace_tree, info->task_filter,
101 info->hide_tasks);
101 102
102 tracecmd_xml_close(handle); 103 tracecmd_xml_close(handle);
103} 104}
@@ -120,7 +121,8 @@ save_filters_clicked (gpointer data)
120 warning("Could not create %s", filename); 121 warning("Could not create %s", filename);
121 g_free(filename); 122 g_free(filename);
122 123
123 trace_view_save_filters(handle, trace_tree); 124 trace_view_save_filters(handle, trace_tree,
125 info->task_filter, info->hide_tasks);
124 126
125 tracecmd_xml_close(handle); 127 tracecmd_xml_close(handle);
126} 128}
diff --git a/trace-view.c b/trace-view.c
index 094f226..c1ce4ff 100644
--- a/trace-view.c
+++ b/trace-view.c
@@ -873,7 +873,9 @@ void trace_view_search_setup(GtkBox *box, GtkTreeView *treeview)
873} 873}
874 874
875int trace_view_save_filters(struct tracecmd_xml_handle *handle, 875int trace_view_save_filters(struct tracecmd_xml_handle *handle,
876 GtkTreeView *trace_tree) 876 GtkTreeView *trace_tree,
877 struct filter_task *task_filter,
878 struct filter_task *hide_tasks)
877{ 879{
878 struct event_filter *event_filter; 880 struct event_filter *event_filter;
879 GtkTreeModel *model; 881 GtkTreeModel *model;
@@ -902,15 +904,15 @@ int trace_view_save_filters(struct tracecmd_xml_handle *handle,
902 904
903 tracecmd_xml_end_sub_system(handle); 905 tracecmd_xml_end_sub_system(handle);
904 906
905 if (store->task_filter) { 907 if (task_filter && filter_task_count(task_filter)) {
906 tracecmd_xml_start_sub_system(handle, "TaskFilter"); 908 tracecmd_xml_start_sub_system(handle, "TaskFilter");
907 trace_filter_save_tasks(handle, store->task_filter); 909 trace_filter_save_tasks(handle, task_filter);
908 tracecmd_xml_end_sub_system(handle); 910 tracecmd_xml_end_sub_system(handle);
909 } 911 }
910 912
911 if (store->hide_tasks) { 913 if (hide_tasks && filter_task_count(hide_tasks)) {
912 tracecmd_xml_start_sub_system(handle, "HideTasks"); 914 tracecmd_xml_start_sub_system(handle, "HideTasks");
913 trace_filter_save_tasks(handle, store->hide_tasks); 915 trace_filter_save_tasks(handle, hide_tasks);
914 tracecmd_xml_end_sub_system(handle); 916 tracecmd_xml_end_sub_system(handle);
915 } 917 }
916 918
@@ -951,44 +953,10 @@ static int load_event_filter(TraceViewStore *store,
951 return 0; 953 return 0;
952} 954}
953 955
954static int load_task_filter(TraceViewStore *store,
955 struct tracecmd_xml_handle *handle,
956 struct tracecmd_xml_system_node *node)
957{
958 struct tracecmd_xml_system_node *child;
959 const char *name;
960 const char *value;
961
962 child = tracecmd_xml_node_child(node);
963 name = tracecmd_xml_node_type(child);
964 if (strcmp(name, "FilterType") == 0) {
965 value = tracecmd_xml_node_value(handle, child);
966 printf("value = %s\n", value);
967 }
968
969 return 0;
970}
971
972static int load_hide_tasks(TraceViewStore *store,
973 struct tracecmd_xml_handle *handle,
974 struct tracecmd_xml_system_node *node)
975{
976 struct tracecmd_xml_system_node *child;
977 const char *name;
978 const char *value;
979
980 child = tracecmd_xml_node_child(node);
981 name = tracecmd_xml_node_type(child);
982 if (strcmp(name, "FilterType") == 0) {
983 value = tracecmd_xml_node_value(handle, child);
984 printf("value = %s\n", value);
985 }
986
987 return 0;
988}
989
990int trace_view_load_filters(struct tracecmd_xml_handle *handle, 956int trace_view_load_filters(struct tracecmd_xml_handle *handle,
991 GtkTreeView *trace_tree) 957 GtkTreeView *trace_tree,
958 struct filter_task *task_filter,
959 struct filter_task *hide_tasks)
992{ 960{
993 struct tracecmd_xml_system *system; 961 struct tracecmd_xml_system *system;
994 struct tracecmd_xml_system_node *syschild; 962 struct tracecmd_xml_system_node *syschild;
@@ -1017,10 +985,10 @@ int trace_view_load_filters(struct tracecmd_xml_handle *handle,
1017 load_event_filter(store, handle, syschild); 985 load_event_filter(store, handle, syschild);
1018 986
1019 else if (strcmp(name, "TaskFilter") == 0) 987 else if (strcmp(name, "TaskFilter") == 0)
1020 load_task_filter(store, handle, syschild); 988 trace_filter_load_task_filter(task_filter, handle, syschild);
1021 989
1022 else if (strcmp(name, "HideTasks") == 0) 990 else if (strcmp(name, "HideTasks") == 0)
1023 load_hide_tasks(store, handle, syschild); 991 trace_filter_load_task_filter(hide_tasks, handle, syschild);
1024 992
1025 syschild = tracecmd_xml_node_next(syschild); 993 syschild = tracecmd_xml_node_next(syschild);
1026 } while (syschild); 994 } while (syschild);
diff --git a/trace-view.h b/trace-view.h
index 81dac6f..b0ba7ed 100644
--- a/trace-view.h
+++ b/trace-view.h
@@ -67,8 +67,12 @@ void trace_view_search_setup(GtkBox *box, GtkTreeView *treeview);
67gint trace_view_get_selected_row(GtkWidget *treeview); 67gint trace_view_get_selected_row(GtkWidget *treeview);
68 68
69int trace_view_save_filters(struct tracecmd_xml_handle *handle, 69int trace_view_save_filters(struct tracecmd_xml_handle *handle,
70 GtkTreeView *treeview); 70 GtkTreeView *treeview,
71 struct filter_task *task_filter,
72 struct filter_task *hide_tasks);
71int trace_view_load_filters(struct tracecmd_xml_handle *handle, 73int trace_view_load_filters(struct tracecmd_xml_handle *handle,
72 GtkTreeView *treeview); 74 GtkTreeView *treeview,
75 struct filter_task *task_filter,
76 struct filter_task *hide_tasks);
73 77
74#endif /* _TRACE_VIEW_H */ 78#endif /* _TRACE_VIEW_H */