diff options
| author | Steven Rostedt <srostedt@redhat.com> | 2010-04-05 20:56:05 -0400 |
|---|---|---|
| committer | Steven Rostedt <rostedt@goodmis.org> | 2010-04-09 11:56:18 -0400 |
| commit | 64be78aa61dfda0c5fdf5c7ccfc2d9a93ba52aa5 (patch) | |
| tree | f6248d42260462c68ee79b19d63c3a4f8470cf00 | |
| parent | 81b404df1d425f146527dc3da253365071e68bea (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.c | 43 | ||||
| -rw-r--r-- | trace-filter.h | 3 | ||||
| -rw-r--r-- | trace-hash.c | 27 | ||||
| -rw-r--r-- | trace-hash.h | 1 | ||||
| -rw-r--r-- | trace-view-main.c | 6 | ||||
| -rw-r--r-- | trace-view.c | 56 | ||||
| -rw-r--r-- | trace-view.h | 8 |
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, | |||
| 2207 | int trace_filter_save_tasks(struct tracecmd_xml_handle *handle, | 2207 | int 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 | |||
| 2303 | int 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, | |||
| 145 | int trace_filter_load_events(struct event_filter *event_filter, | 145 | int 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); |
| 148 | int 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 | |||
| 160 | int *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); | |||
| 42 | struct filter_task *filter_task_hash_alloc(void); | 42 | struct filter_task *filter_task_hash_alloc(void); |
| 43 | void filter_task_hash_free(struct filter_task *hash); | 43 | void filter_task_hash_free(struct filter_task *hash); |
| 44 | struct filter_task *filter_task_hash_copy(struct filter_task *hash); | 44 | struct filter_task *filter_task_hash_copy(struct filter_task *hash); |
| 45 | int *filter_task_pids(struct filter_task *hash); | ||
| 45 | 46 | ||
| 46 | static inline gint filter_task_count(struct filter_task *hash) | 47 | static 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 | ||
| 875 | int trace_view_save_filters(struct tracecmd_xml_handle *handle, | 875 | int 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 | ||
| 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, | 956 | int 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); | |||
| 67 | gint trace_view_get_selected_row(GtkWidget *treeview); | 67 | 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 | struct filter_task *task_filter, | ||
| 72 | struct filter_task *hide_tasks); | ||
| 71 | int trace_view_load_filters(struct tracecmd_xml_handle *handle, | 73 | int 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 */ |
