aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2009-12-01 17:03:16 -0500
committerSteven Rostedt <rostedt@goodmis.org>2009-12-01 17:53:43 -0500
commitad3e3e234a0c561c08de21e63b4930ed965c7142 (patch)
treee2d44eafca07f2f2db6eb308a8f26b767b6e3bec
parent704107f0a5577a863776bcc3c17e97ff74431671 (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.c97
-rw-r--r--parse-events.h7
-rw-r--r--trace-read.c14
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
401static struct event *event_list; 401static struct event *event_list;
402static int nr_events;
402 403
403static void add_event(struct event *event) 404static 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
409static int event_item_type(enum event_type type) 411static 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
2967static 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
2981static 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
2998static 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
3015struct 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
2965static void print_fields(struct trace_seq *s, struct print_flag_sym *field) 3062static 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
199enum event_sort_type {
200 EVENT_SORT_ID,
201 EVENT_SORT_NAME,
202 EVENT_SORT_SYSTEM,
203};
204
199extern int old_format; 205extern int old_format;
200 206
201void parse_set_info(int nr_cpus, int long_sz); 207void parse_set_info(int nr_cpus, int long_sz);
@@ -314,6 +320,7 @@ const char *pevent_data_comm_from_pid(int pid);
314void pevent_event_info(struct trace_seq *s, struct event *event, 320void 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
323struct event **pevent_list_events(enum event_sort_type);
317 324
318/* for debugging */ 325/* for debugging */
319void pevent_print_funcs(void); 326void 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