diff options
author | Steven Rostedt <srostedt@redhat.com> | 2009-12-01 17:03:16 -0500 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2009-12-01 17:53:43 -0500 |
commit | ad3e3e234a0c561c08de21e63b4930ed965c7142 (patch) | |
tree | e2d44eafca07f2f2db6eb308a8f26b767b6e3bec | |
parent | 704107f0a5577a863776bcc3c17e97ff74431671 (diff) |
Add way to retrieve all events
This adds the function pevent_list_events that returns a list
of event pointers. One can pass in a sort algorithm too.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r-- | parse-events.c | 97 | ||||
-rw-r--r-- | parse-events.h | 7 | ||||
-rw-r--r-- | trace-read.c | 14 |
3 files changed, 117 insertions, 1 deletions
diff --git a/parse-events.c b/parse-events.c index 7e7b74f..737bdde 100644 --- a/parse-events.c +++ b/parse-events.c | |||
@@ -399,11 +399,13 @@ enum event_type { | |||
399 | }; | 399 | }; |
400 | 400 | ||
401 | static struct event *event_list; | 401 | static struct event *event_list; |
402 | static int nr_events; | ||
402 | 403 | ||
403 | static void add_event(struct event *event) | 404 | static void add_event(struct event *event) |
404 | { | 405 | { |
405 | event->next = event_list; | 406 | event->next = event_list; |
406 | event_list = event; | 407 | event_list = event; |
408 | nr_events++; | ||
407 | } | 409 | } |
408 | 410 | ||
409 | static int event_item_type(enum event_type type) | 411 | static int event_item_type(enum event_type type) |
@@ -2962,6 +2964,101 @@ void pevent_print_event(struct trace_seq *s, | |||
2962 | 2964 | ||
2963 | } | 2965 | } |
2964 | 2966 | ||
2967 | static int events_id_cmp(const void *a, const void *b) | ||
2968 | { | ||
2969 | struct event * const * ea = a; | ||
2970 | struct event * const * eb = b; | ||
2971 | |||
2972 | if ((*ea)->id < (*eb)->id) | ||
2973 | return -1; | ||
2974 | |||
2975 | if ((*ea)->id > (*eb)->id) | ||
2976 | return 1; | ||
2977 | |||
2978 | return 0; | ||
2979 | } | ||
2980 | |||
2981 | static int events_name_cmp(const void *a, const void *b) | ||
2982 | { | ||
2983 | struct event * const * ea = a; | ||
2984 | struct event * const * eb = b; | ||
2985 | int res; | ||
2986 | |||
2987 | res = strcmp((*ea)->name, (*eb)->name); | ||
2988 | if (res) | ||
2989 | return res; | ||
2990 | |||
2991 | res = strcmp((*ea)->system, (*eb)->system); | ||
2992 | if (res) | ||
2993 | return res; | ||
2994 | |||
2995 | return events_id_cmp(a, b); | ||
2996 | } | ||
2997 | |||
2998 | static int events_system_cmp(const void *a, const void *b) | ||
2999 | { | ||
3000 | struct event * const * ea = a; | ||
3001 | struct event * const * eb = b; | ||
3002 | int res; | ||
3003 | |||
3004 | res = strcmp((*ea)->system, (*eb)->system); | ||
3005 | if (res) | ||
3006 | return res; | ||
3007 | |||
3008 | res = strcmp((*ea)->name, (*eb)->name); | ||
3009 | if (res) | ||
3010 | return res; | ||
3011 | |||
3012 | return events_id_cmp(a, b); | ||
3013 | } | ||
3014 | |||
3015 | struct event **pevent_list_events(enum event_sort_type sort_type) | ||
3016 | { | ||
3017 | static struct event **events; | ||
3018 | static enum event_sort_type last_type; | ||
3019 | struct event *event; | ||
3020 | int (*sort)(const void *a, const void *b); | ||
3021 | int i = 0; | ||
3022 | |||
3023 | if (events && last_type == sort_type) | ||
3024 | return events; | ||
3025 | |||
3026 | if (!events) { | ||
3027 | events = malloc(sizeof(*events) * (nr_events + 1)); | ||
3028 | if (!events) | ||
3029 | return NULL; | ||
3030 | |||
3031 | for (event = event_list; event; event = event->next) { | ||
3032 | if (i == nr_events) { | ||
3033 | warning("Wrong event count"); | ||
3034 | free(events); | ||
3035 | return NULL; | ||
3036 | } | ||
3037 | events[i++] = event; | ||
3038 | } | ||
3039 | events[i] = NULL; | ||
3040 | } | ||
3041 | |||
3042 | switch (sort_type) { | ||
3043 | case EVENT_SORT_ID: | ||
3044 | sort = events_id_cmp; | ||
3045 | break; | ||
3046 | case EVENT_SORT_NAME: | ||
3047 | sort = events_name_cmp; | ||
3048 | break; | ||
3049 | case EVENT_SORT_SYSTEM: | ||
3050 | sort = events_system_cmp; | ||
3051 | break; | ||
3052 | default: | ||
3053 | return events; | ||
3054 | } | ||
3055 | |||
3056 | qsort(events, nr_events, sizeof(*events), sort); | ||
3057 | last_type = sort_type; | ||
3058 | |||
3059 | return events; | ||
3060 | } | ||
3061 | |||
2965 | static void print_fields(struct trace_seq *s, struct print_flag_sym *field) | 3062 | static void print_fields(struct trace_seq *s, struct print_flag_sym *field) |
2966 | { | 3063 | { |
2967 | trace_seq_printf(s, "{ %s, %s }", field->value, field->str); | 3064 | trace_seq_printf(s, "{ %s, %s }", field->value, field->str); |
diff --git a/parse-events.h b/parse-events.h index ea6fe20..edd2292 100644 --- a/parse-events.h +++ b/parse-events.h | |||
@@ -196,6 +196,12 @@ enum { | |||
196 | EVENT_FL_FAILED = 0x80000000 | 196 | EVENT_FL_FAILED = 0x80000000 |
197 | }; | 197 | }; |
198 | 198 | ||
199 | enum event_sort_type { | ||
200 | EVENT_SORT_ID, | ||
201 | EVENT_SORT_NAME, | ||
202 | EVENT_SORT_SYSTEM, | ||
203 | }; | ||
204 | |||
199 | extern int old_format; | 205 | extern int old_format; |
200 | 206 | ||
201 | void parse_set_info(int nr_cpus, int long_sz); | 207 | void parse_set_info(int nr_cpus, int long_sz); |
@@ -314,6 +320,7 @@ const char *pevent_data_comm_from_pid(int pid); | |||
314 | void pevent_event_info(struct trace_seq *s, struct event *event, | 320 | void pevent_event_info(struct trace_seq *s, struct event *event, |
315 | int cpu, void *data, int size, unsigned long long nsecs); | 321 | int cpu, void *data, int size, unsigned long long nsecs); |
316 | 322 | ||
323 | struct event **pevent_list_events(enum event_sort_type); | ||
317 | 324 | ||
318 | /* for debugging */ | 325 | /* for debugging */ |
319 | void pevent_print_funcs(void); | 326 | void pevent_print_funcs(void); |
diff --git a/trace-read.c b/trace-read.c index ec4272c..280f6d3 100644 --- a/trace-read.c +++ b/trace-read.c | |||
@@ -227,8 +227,20 @@ void trace_report (int argc, char **argv) | |||
227 | return; | 227 | return; |
228 | } | 228 | } |
229 | 229 | ||
230 | if (show_events) | 230 | if (show_events) { |
231 | struct event **events; | ||
232 | struct event *event; | ||
233 | int i; | ||
234 | |||
235 | events = pevent_list_events(EVENT_SORT_SYSTEM); | ||
236 | for (i = 0; events[i]; i++) { | ||
237 | event = events[i]; | ||
238 | if (event->system) | ||
239 | printf("%s:", event->system); | ||
240 | printf("%s\n", event->name); | ||
241 | } | ||
231 | return; | 242 | return; |
243 | } | ||
232 | 244 | ||
233 | read_data_info(handle); | 245 | read_data_info(handle); |
234 | 246 | ||