diff options
author | Steven Rostedt <srostedt@redhat.com> | 2010-04-05 12:40:51 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2010-04-09 11:56:18 -0400 |
commit | b2a9cd2f38f6c3c30e9ef4c47eb004b41b50fe5e (patch) | |
tree | 976dbf8b5f833a31787ff6a4e2f3ca2a4f5d869e | |
parent | 3f1e092ed414ab2a9f73eafe87f35e868030463c (diff) |
trace-view: Add loading of saved event filters
Add "Load filters" to trace-view that loads the event filters
saved with a "Save filters".
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r-- | trace-filter.c | 75 | ||||
-rw-r--r-- | trace-filter.h | 14 | ||||
-rw-r--r-- | trace-view-main.c | 46 | ||||
-rw-r--r-- | trace-view.c | 116 | ||||
-rw-r--r-- | trace-view.h | 2 | ||||
-rw-r--r-- | trace-xml.c | 104 | ||||
-rw-r--r-- | trace-xml.h | 19 |
7 files changed, 366 insertions, 10 deletions
diff --git a/trace-filter.c b/trace-filter.c index 904c9cb..efdb5fa 100644 --- a/trace-filter.c +++ b/trace-filter.c | |||
@@ -2209,3 +2209,78 @@ int trace_filter_save_tasks(struct tracecmd_xml_handle *handle, | |||
2209 | { | 2209 | { |
2210 | return 0; | 2210 | return 0; |
2211 | } | 2211 | } |
2212 | |||
2213 | int trace_filter_load_events(struct event_filter *event_filter, | ||
2214 | struct tracecmd_xml_handle *handle, | ||
2215 | struct tracecmd_xml_system_node *node) | ||
2216 | { | ||
2217 | struct tracecmd_xml_system_node *child; | ||
2218 | const char *name; | ||
2219 | const char *system; | ||
2220 | const char *event; | ||
2221 | const char *value; | ||
2222 | char *buffer; | ||
2223 | |||
2224 | while (node) { | ||
2225 | name = tracecmd_xml_node_type(node); | ||
2226 | |||
2227 | if (strcmp(name, "System") == 0) { | ||
2228 | system = tracecmd_xml_node_value(handle, node); | ||
2229 | pevent_filter_add_filter_str(event_filter, | ||
2230 | system, NULL); | ||
2231 | } else if (strcmp(name, "Event") == 0) { | ||
2232 | system = NULL; | ||
2233 | event = NULL; | ||
2234 | value = NULL; | ||
2235 | child = tracecmd_xml_node_child(node); | ||
2236 | if (!child) | ||
2237 | return -1; | ||
2238 | do { | ||
2239 | name = tracecmd_xml_node_type(child); | ||
2240 | if (strcmp(name, "System") == 0) | ||
2241 | system = tracecmd_xml_node_value(handle, child); | ||
2242 | else if (strcmp(name, "Name") == 0) | ||
2243 | event = tracecmd_xml_node_value(handle, child); | ||
2244 | else if (strcmp(name, "Advanced") == 0) | ||
2245 | value = tracecmd_xml_node_value(handle, child); | ||
2246 | child = tracecmd_xml_node_next(child); | ||
2247 | } while (child); | ||
2248 | |||
2249 | if (event || system) { | ||
2250 | if (event && system) { | ||
2251 | if (value) { | ||
2252 | buffer = malloc_or_die(strlen(event) + | ||
2253 | strlen(system) + | ||
2254 | strlen(value) + 3); | ||
2255 | sprintf(buffer, "%s/%s:%s", | ||
2256 | system, event, value); | ||
2257 | } else { | ||
2258 | buffer = malloc_or_die(strlen(event) + | ||
2259 | strlen(system) + 2); | ||
2260 | sprintf(buffer, "%s/%s", | ||
2261 | system, event); | ||
2262 | } | ||
2263 | } else { | ||
2264 | if (!event) | ||
2265 | event = system; | ||
2266 | if (value) { | ||
2267 | buffer = malloc_or_die(strlen(event) + | ||
2268 | strlen(value) + 2); | ||
2269 | sprintf(buffer, "%s:%s", | ||
2270 | event, value); | ||
2271 | } else { | ||
2272 | buffer = malloc_or_die(strlen(event) + 1); | ||
2273 | sprintf(buffer, "%s", event); | ||
2274 | } | ||
2275 | } | ||
2276 | pevent_filter_add_filter_str(event_filter, | ||
2277 | buffer, NULL); | ||
2278 | free(buffer); | ||
2279 | } | ||
2280 | } | ||
2281 | |||
2282 | node = tracecmd_xml_node_next(node); | ||
2283 | } | ||
2284 | |||
2285 | return 0; | ||
2286 | } | ||
diff --git a/trace-filter.h b/trace-filter.h index 7575244..915b174 100644 --- a/trace-filter.h +++ b/trace-filter.h | |||
@@ -135,16 +135,20 @@ typedef void (*trace_filter_cpu_cb_func)(gboolean accept, | |||
135 | void trace_filter_cpu_dialog(gboolean all_cpus, guint64 *cpu_mask_selected, gint cpus, | 135 | void trace_filter_cpu_dialog(gboolean all_cpus, guint64 *cpu_mask_selected, gint cpus, |
136 | trace_filter_cpu_cb_func func, gpointer data); | 136 | trace_filter_cpu_cb_func func, gpointer data); |
137 | 137 | ||
138 | /* put here because there's no other place */ | ||
139 | |||
140 | int str_cmp(const void *a, const void *b); | ||
141 | int id_cmp(const void *a, const void *b); | ||
142 | |||
143 | void trace_array_add(gint **array, gint *count, gint val); | 138 | void trace_array_add(gint **array, gint *count, gint val); |
144 | 139 | ||
140 | /* save and load filters */ | ||
145 | int trace_filter_save_events(struct tracecmd_xml_handle *handle, | 141 | int trace_filter_save_events(struct tracecmd_xml_handle *handle, |
146 | struct event_filter *filter); | 142 | struct event_filter *filter); |
147 | int trace_filter_save_tasks(struct tracecmd_xml_handle *handle, | 143 | int trace_filter_save_tasks(struct tracecmd_xml_handle *handle, |
148 | struct filter_task *filter); | 144 | struct filter_task *filter); |
145 | int trace_filter_load_events(struct event_filter *event_filter, | ||
146 | struct tracecmd_xml_handle *handle, | ||
147 | struct tracecmd_xml_system_node *node); | ||
148 | |||
149 | /* put here because there's no other place */ | ||
150 | |||
151 | int str_cmp(const void *a, const void *b); | ||
152 | int id_cmp(const void *a, const void *b); | ||
149 | 153 | ||
150 | #endif /* _TRACE_FILTER_H */ | 154 | #endif /* _TRACE_FILTER_H */ |
diff --git a/trace-view-main.c b/trace-view-main.c index 52fb4f8..22b9e32 100644 --- a/trace-view-main.c +++ b/trace-view-main.c | |||
@@ -72,7 +72,30 @@ load_clicked (gpointer data) | |||
72 | g_free(filename); | 72 | g_free(filename); |
73 | } | 73 | } |
74 | 74 | ||
75 | /* Callback for the clicked signal of the Save State button */ | 75 | /* Callback for the clicked signal of the Load Filters button */ |
76 | static void | ||
77 | load_filters_clicked (gpointer data) | ||
78 | { | ||
79 | struct trace_tree_info *info = data; | ||
80 | GtkTreeView *trace_tree = GTK_TREE_VIEW(info->trace_tree); | ||
81 | struct tracecmd_xml_handle *handle; | ||
82 | gchar *filename; | ||
83 | |||
84 | filename = trace_get_file_dialog("Load Filters"); | ||
85 | if (!filename) | ||
86 | return; | ||
87 | |||
88 | handle = tracecmd_xml_open(filename); | ||
89 | if (!handle) | ||
90 | warning("Could not open %s", filename); | ||
91 | g_free(filename); | ||
92 | |||
93 | trace_view_load_filters(handle, trace_tree); | ||
94 | |||
95 | tracecmd_xml_close(handle); | ||
96 | } | ||
97 | |||
98 | /* Callback for the clicked signal of the Save Filters button */ | ||
76 | static void | 99 | static void |
77 | save_filters_clicked (gpointer data) | 100 | save_filters_clicked (gpointer data) |
78 | { | 101 | { |
@@ -81,13 +104,13 @@ save_filters_clicked (gpointer data) | |||
81 | struct tracecmd_xml_handle *handle; | 104 | struct tracecmd_xml_handle *handle; |
82 | gchar *filename; | 105 | gchar *filename; |
83 | 106 | ||
84 | filename = trace_get_file_dialog("Save State"); | 107 | filename = trace_get_file_dialog("Save Filters"); |
85 | if (!filename) | 108 | if (!filename) |
86 | return; | 109 | return; |
87 | 110 | ||
88 | handle = tracecmd_xml_create(filename); | 111 | handle = tracecmd_xml_create(filename); |
89 | if (!handle) | 112 | if (!handle) |
90 | warning("Could not create save state %s", filename); | 113 | warning("Could not create %s", filename); |
91 | g_free(filename); | 114 | g_free(filename); |
92 | 115 | ||
93 | trace_view_save_filters(handle, trace_tree); | 116 | trace_view_save_filters(handle, trace_tree); |
@@ -286,7 +309,22 @@ void trace_view(int argc, char **argv) | |||
286 | gtk_widget_show(sub_item); | 309 | gtk_widget_show(sub_item); |
287 | 310 | ||
288 | 311 | ||
289 | /* --- File - Save State Option --- */ | 312 | /* --- File - Load Filter Option --- */ |
313 | |||
314 | sub_item = gtk_menu_item_new_with_label("Load filters"); | ||
315 | |||
316 | /* Add them to the menu */ | ||
317 | gtk_menu_shell_append(GTK_MENU_SHELL (menu), sub_item); | ||
318 | |||
319 | g_signal_connect_swapped (G_OBJECT (sub_item), "activate", | ||
320 | G_CALLBACK (load_filters_clicked), | ||
321 | (gpointer) &tree_info); | ||
322 | |||
323 | /* We do need to show menu items */ | ||
324 | gtk_widget_show(sub_item); | ||
325 | |||
326 | |||
327 | /* --- File - Save Filter Option --- */ | ||
290 | 328 | ||
291 | sub_item = gtk_menu_item_new_with_label("Save filters"); | 329 | sub_item = gtk_menu_item_new_with_label("Save filters"); |
292 | 330 | ||
diff --git a/trace-view.c b/trace-view.c index c183b19..094f226 100644 --- a/trace-view.c +++ b/trace-view.c | |||
@@ -918,3 +918,119 @@ int trace_view_save_filters(struct tracecmd_xml_handle *handle, | |||
918 | 918 | ||
919 | return 0; | 919 | return 0; |
920 | } | 920 | } |
921 | |||
922 | static int load_event_filter(TraceViewStore *store, | ||
923 | struct tracecmd_xml_handle *handle, | ||
924 | struct tracecmd_xml_system_node *node) | ||
925 | { | ||
926 | struct tracecmd_xml_system_node *child; | ||
927 | struct event_filter *event_filter; | ||
928 | const char *name; | ||
929 | const char *value; | ||
930 | |||
931 | event_filter = trace_view_store_get_event_filter(store); | ||
932 | |||
933 | child = tracecmd_xml_node_child(node); | ||
934 | name = tracecmd_xml_node_type(child); | ||
935 | if (strcmp(name, "FilterType") != 0) | ||
936 | return -1; | ||
937 | |||
938 | value = tracecmd_xml_node_value(handle, child); | ||
939 | /* Do nothing with all events enabled */ | ||
940 | if (strcmp(value, "all events") == 0) | ||
941 | return 0; | ||
942 | |||
943 | node = tracecmd_xml_node_next(child); | ||
944 | if (!node) | ||
945 | return -1; | ||
946 | |||
947 | trace_view_store_clear_all_events_enabled(store); | ||
948 | |||
949 | trace_filter_load_events(event_filter, handle, node); | ||
950 | |||
951 | return 0; | ||
952 | } | ||
953 | |||
954 | static 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 | |||
972 | static 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 | |||
990 | int trace_view_load_filters(struct tracecmd_xml_handle *handle, | ||
991 | GtkTreeView *trace_tree) | ||
992 | { | ||
993 | struct tracecmd_xml_system *system; | ||
994 | struct tracecmd_xml_system_node *syschild; | ||
995 | GtkTreeModel *model; | ||
996 | TraceViewStore *store; | ||
997 | const char *name; | ||
998 | |||
999 | model = gtk_tree_view_get_model(trace_tree); | ||
1000 | if (!model) | ||
1001 | return -1; | ||
1002 | |||
1003 | store = TRACE_VIEW_STORE(model); | ||
1004 | |||
1005 | system = tracecmd_xml_find_system(handle, "TraceView"); | ||
1006 | if (!system) | ||
1007 | return -1; | ||
1008 | |||
1009 | syschild = tracecmd_xml_system_node(system); | ||
1010 | if (!syschild) | ||
1011 | goto out_free_sys; | ||
1012 | |||
1013 | do { | ||
1014 | name = tracecmd_xml_node_type(syschild); | ||
1015 | |||
1016 | if (strcmp(name, "EventFilter") == 0) | ||
1017 | load_event_filter(store, handle, syschild); | ||
1018 | |||
1019 | else if (strcmp(name, "TaskFilter") == 0) | ||
1020 | load_task_filter(store, handle, syschild); | ||
1021 | |||
1022 | else if (strcmp(name, "HideTasks") == 0) | ||
1023 | load_hide_tasks(store, handle, syschild); | ||
1024 | |||
1025 | syschild = tracecmd_xml_node_next(syschild); | ||
1026 | } while (syschild); | ||
1027 | |||
1028 | tracecmd_xml_free_system(system); | ||
1029 | |||
1030 | update_rows(trace_tree, store); | ||
1031 | return 0; | ||
1032 | |||
1033 | out_free_sys: | ||
1034 | tracecmd_xml_free_system(system); | ||
1035 | return -1; | ||
1036 | } | ||
diff --git a/trace-view.h b/trace-view.h index 5ad33bf..81dac6f 100644 --- a/trace-view.h +++ b/trace-view.h | |||
@@ -68,5 +68,7 @@ gint trace_view_get_selected_row(GtkWidget *treeview); | |||
68 | 68 | ||
69 | int trace_view_save_filters(struct tracecmd_xml_handle *handle, | 69 | int trace_view_save_filters(struct tracecmd_xml_handle *handle, |
70 | GtkTreeView *treeview); | 70 | GtkTreeView *treeview); |
71 | int trace_view_load_filters(struct tracecmd_xml_handle *handle, | ||
72 | GtkTreeView *treeview); | ||
71 | 73 | ||
72 | #endif /* _TRACE_VIEW_H */ | 74 | #endif /* _TRACE_VIEW_H */ |
diff --git a/trace-xml.c b/trace-xml.c index 0bc130c..47cb3c9 100644 --- a/trace-xml.c +++ b/trace-xml.c | |||
@@ -25,13 +25,20 @@ | |||
25 | 25 | ||
26 | #include <libxml/xmlwriter.h> | 26 | #include <libxml/xmlwriter.h> |
27 | #include <libxml/parser.h> | 27 | #include <libxml/parser.h> |
28 | #include <libxml/encoding.h> | 28 | #include <libxml/xpath.h> |
29 | 29 | ||
30 | #include "trace-cmd.h" | 30 | #include "trace-cmd.h" |
31 | #include "trace-xml.h" | 31 | #include "trace-xml.h" |
32 | 32 | ||
33 | struct tracecmd_xml_handle { | 33 | struct tracecmd_xml_handle { |
34 | xmlTextWriterPtr writer; | 34 | xmlTextWriterPtr writer; |
35 | xmlDocPtr doc; | ||
36 | }; | ||
37 | |||
38 | struct tracecmd_xml_system { | ||
39 | struct tracecmd_xml_handle *handle; | ||
40 | xmlXPathObjectPtr result; | ||
41 | xmlNodePtr cur; | ||
35 | }; | 42 | }; |
36 | 43 | ||
37 | #define TRACE_ENCODING "UTF-8" | 44 | #define TRACE_ENCODING "UTF-8" |
@@ -122,6 +129,101 @@ void tracecmd_xml_close(struct tracecmd_xml_handle *handle) | |||
122 | xmlTextWriterEndDocument(handle->writer); | 129 | xmlTextWriterEndDocument(handle->writer); |
123 | xmlFreeTextWriter(handle->writer); | 130 | xmlFreeTextWriter(handle->writer); |
124 | } | 131 | } |
132 | if (handle->doc) { | ||
133 | xmlFreeDoc(handle->doc); | ||
134 | } | ||
135 | free(handle); | ||
136 | } | ||
137 | |||
138 | /***********************************************************/ | ||
139 | /*** Reading XML files ***/ | ||
140 | /***********************************************************/ | ||
141 | |||
142 | |||
143 | struct tracecmd_xml_handle *tracecmd_xml_open(const char *file) | ||
144 | { | ||
145 | struct tracecmd_xml_handle *handle; | ||
125 | 146 | ||
147 | handle = malloc_or_die(sizeof(*handle)); | ||
148 | memset(handle, 0, sizeof(*handle)); | ||
149 | |||
150 | handle->doc = xmlParseFile(file); | ||
151 | if (!handle->doc) | ||
152 | goto fail_free; | ||
153 | |||
154 | return handle; | ||
155 | |||
156 | fail_free: | ||
126 | free(handle); | 157 | free(handle); |
158 | return NULL; | ||
159 | } | ||
160 | |||
161 | struct tracecmd_xml_system * | ||
162 | tracecmd_xml_find_system(struct tracecmd_xml_handle *handle, | ||
163 | const char *system) | ||
164 | { | ||
165 | struct tracecmd_xml_system *sys; | ||
166 | xmlXPathContextPtr context; | ||
167 | xmlXPathObjectPtr result; | ||
168 | xmlChar *xpath; | ||
169 | char *path; | ||
170 | |||
171 | path = malloc_or_die(strlen(system) + 3); | ||
172 | sprintf(path, "//%s", system); | ||
173 | xpath = BAD_CAST path; | ||
174 | |||
175 | context = xmlXPathNewContext(handle->doc); | ||
176 | result = xmlXPathEvalExpression(xpath, context); | ||
177 | free(path); | ||
178 | |||
179 | if (xmlXPathNodeSetIsEmpty(result->nodesetval)) { | ||
180 | xmlXPathFreeObject(result); | ||
181 | return NULL; | ||
182 | } | ||
183 | |||
184 | sys = malloc_or_die(sizeof(*sys)); | ||
185 | sys->handle = handle; | ||
186 | sys->result = result; | ||
187 | sys->cur = result->nodesetval->nodeTab[0]->xmlChildrenNode; | ||
188 | |||
189 | return sys; | ||
190 | } | ||
191 | |||
192 | struct tracecmd_xml_system_node * | ||
193 | tracecmd_xml_system_node(struct tracecmd_xml_system *system) | ||
194 | { | ||
195 | return (struct tracecmd_xml_system_node *)system->cur; | ||
196 | } | ||
197 | |||
198 | const char *tracecmd_xml_node_type(struct tracecmd_xml_system_node *tnode) | ||
199 | { | ||
200 | xmlNodePtr node = (xmlNodePtr)tnode; | ||
201 | return (const char *)node->name; | ||
202 | } | ||
203 | |||
204 | struct tracecmd_xml_system_node * | ||
205 | tracecmd_xml_node_child(struct tracecmd_xml_system_node *tnode) | ||
206 | { | ||
207 | xmlNodePtr node = (xmlNodePtr)tnode; | ||
208 | return (struct tracecmd_xml_system_node *)node->xmlChildrenNode; | ||
209 | } | ||
210 | |||
211 | struct tracecmd_xml_system_node * | ||
212 | tracecmd_xml_node_next(struct tracecmd_xml_system_node *tnode) | ||
213 | { | ||
214 | xmlNodePtr node = (xmlNodePtr)tnode; | ||
215 | return (struct tracecmd_xml_system_node *)node->next; | ||
216 | } | ||
217 | |||
218 | const char *tracecmd_xml_node_value(struct tracecmd_xml_handle *handle, | ||
219 | struct tracecmd_xml_system_node *tnode) | ||
220 | { | ||
221 | xmlNodePtr node = (xmlNodePtr)tnode; | ||
222 | return (const char *)xmlNodeListGetString(handle->doc, node->xmlChildrenNode, 1); | ||
223 | } | ||
224 | |||
225 | void tracecmd_xml_free_system(struct tracecmd_xml_system *system) | ||
226 | { | ||
227 | xmlXPathFreeObject(system->result); | ||
228 | free(system); | ||
127 | } | 229 | } |
diff --git a/trace-xml.h b/trace-xml.h index 41f6193..4006538 100644 --- a/trace-xml.h +++ b/trace-xml.h | |||
@@ -22,8 +22,11 @@ | |||
22 | #define __TRACE_XML_H | 22 | #define __TRACE_XML_H |
23 | 23 | ||
24 | struct tracecmd_xml_handle; | 24 | struct tracecmd_xml_handle; |
25 | struct tacecmd_xml_system; | ||
26 | struct tacecmd_xml_system_node; | ||
25 | 27 | ||
26 | struct tracecmd_xml_handle *tracecmd_xml_create(const char *name); | 28 | struct tracecmd_xml_handle *tracecmd_xml_create(const char *name); |
29 | struct tracecmd_xml_handle *tracecmd_xml_open(const char *name); | ||
27 | void tracecmd_xml_close(struct tracecmd_xml_handle *handle); | 30 | void tracecmd_xml_close(struct tracecmd_xml_handle *handle); |
28 | 31 | ||
29 | int tracecmd_xml_start_system(struct tracecmd_xml_handle *handle, | 32 | int tracecmd_xml_start_system(struct tracecmd_xml_handle *handle, |
@@ -38,4 +41,20 @@ int tracecmd_xml_write_element(struct tracecmd_xml_handle *handle, | |||
38 | const char *obj, | 41 | const char *obj, |
39 | const char *fmt, ...); | 42 | const char *fmt, ...); |
40 | 43 | ||
44 | struct tracecmd_xml_handle *tracecmd_xml_open(const char *file); | ||
45 | |||
46 | struct tracecmd_xml_system * | ||
47 | tracecmd_xml_find_system(struct tracecmd_xml_handle *handle, | ||
48 | const char *system); | ||
49 | void tracecmd_xml_free_system(struct tracecmd_xml_system *system); | ||
50 | struct tracecmd_xml_system_node * | ||
51 | tracecmd_xml_system_node(struct tracecmd_xml_system *system); | ||
52 | const char *tracecmd_xml_node_type(struct tracecmd_xml_system_node *tnode); | ||
53 | struct tracecmd_xml_system_node * | ||
54 | tracecmd_xml_node_child(struct tracecmd_xml_system_node *tnode); | ||
55 | struct tracecmd_xml_system_node * | ||
56 | tracecmd_xml_node_next(struct tracecmd_xml_system_node *tnode); | ||
57 | const char *tracecmd_xml_node_value(struct tracecmd_xml_handle *handle, | ||
58 | struct tracecmd_xml_system_node *tnode); | ||
59 | |||
41 | #endif /* __TRACE_XML_H */ | 60 | #endif /* __TRACE_XML_H */ |