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 | ||
