aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2009-11-25 10:12:46 -0500
committerJohannes Berg <johannes@sipsolutions.net>2009-11-25 10:12:46 -0500
commit2a0cf9ebb12ebc7d4fd417d897819d2c2cb6b3f6 (patch)
treecdbf9afb3d8e4f9aa9f72ecb05684728f5c70b25
parent93341c3407d8098efb955494ac6723d61ec2294e (diff)
correct and simplify hrtimer plugin
The current hrtimer plugin code is broken wrt. the return values, but it can now ignore the trace_seq_* return values completely and focus on parsing the data. Also, the handler API should return 0 (all OK) or negative numbers on errors. Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
-rw-r--r--plugin_hrtimer.c59
1 files changed, 26 insertions, 33 deletions
diff --git a/plugin_hrtimer.c b/plugin_hrtimer.c
index 9d9b969..2a074e7 100644
--- a/plugin_hrtimer.c
+++ b/plugin_hrtimer.c
@@ -4,6 +4,7 @@
4 4
5#include "parse-events.h" 5#include "parse-events.h"
6 6
7/* return -1 (field not found/not valid number), 0 (ok), 1 (buffer full) */
7static int _print_field(struct trace_seq *s, const char *fmt, 8static int _print_field(struct trace_seq *s, const char *fmt,
8 struct event *event, const char *name, const void *data) 9 struct event *event, const char *name, const void *data)
9{ 10{
@@ -11,78 +12,70 @@ static int _print_field(struct trace_seq *s, const char *fmt,
11 unsigned long long val; 12 unsigned long long val;
12 13
13 if (!f) 14 if (!f)
14 return 0; 15 return -1;
15 16
16 if (pevent_read_number_field(f, data, &val)) 17 if (pevent_read_number_field(f, data, &val))
17 return 0; 18 return -1;
18 19
19 return trace_seq_printf(s, fmt, val); 20 return trace_seq_printf(s, fmt, val);
20} 21}
21 22
22static int print_field(struct trace_seq *s, const char *fmt, 23/* return 0 (ok), 1 (buffer full) */
23 struct event *event, const char *name, const void *data) 24static void print_field(struct trace_seq *s, const char *fmt,
25 struct event *event, const char *name, const void *data)
24{ 26{
25 int ret = _print_field(s, fmt, event, name, data); 27 int ret = _print_field(s, fmt, event, name, data);
26 28
27 if (ret == 0) 29 if (ret == -1)
28 ret = trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name); 30 trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name);
29
30 return ret;
31} 31}
32 32
33static int timer_expire_handler(struct trace_seq *s, void *data, int size, 33static int timer_expire_handler(struct trace_seq *s, void *data, int size,
34 struct event *event) 34 struct event *event)
35{ 35{
36 int ret = 0, tmp; 36 trace_seq_printf(s, "hrtimer=");
37 37
38 ret += trace_seq_printf(s, "hrtimer="); 38 if (_print_field(s, "0x%llx", event, "timer", data) == -1)
39 tmp = _print_field(s, "0x%llx", event, "timer", data); 39 print_field(s, "0x%llx", event, "hrtimer", data);
40 if (tmp)
41 ret += tmp;
42 else
43 ret += print_field(s, "0x%llx", event, "hrtimer", data);
44 40
45 ret += trace_seq_printf(s, " now="); 41 trace_seq_printf(s, " now=");
46 42
47 ret += print_field(s, "%llu", event, "now", data); 43 print_field(s, "%llu", event, "now", data);
48 44
49 return ret; 45 return 0;
50} 46}
51 47
52static int timer_start_handler(struct trace_seq *s, void *data, int size, 48static int timer_start_handler(struct trace_seq *s, void *data, int size,
53 struct event *event) 49 struct event *event)
54{ 50{
55 struct format_field *fn = pevent_find_field(event, "function"); 51 struct format_field *fn = pevent_find_field(event, "function");
56 int ret = 0, tmp;
57 52
58 ret += trace_seq_printf(s, "hrtimer="); 53 trace_seq_printf(s, "hrtimer=");
59 tmp = _print_field(s, "0x%llx", event, "timer", data); 54
60 if (tmp) 55 if (_print_field(s, "0x%llx", event, "timer", data) == -1)
61 ret += tmp; 56 print_field(s, "0x%llx", event, "hrtimer", data);
62 else
63 ret += print_field(s, "0x%llx", event, "hrtimer", data);
64 57
65 if (!fn) { 58 if (!fn) {
66 ret += trace_seq_printf(s, " function=MISSING"); 59 trace_seq_printf(s, " function=MISSING");
67 } else { 60 } else {
68 unsigned long long function; 61 unsigned long long function;
69 const char *func; 62 const char *func;
70 63
71 if (pevent_read_number_field(fn, data, &function)) 64 if (pevent_read_number_field(fn, data, &function))
72 ret += trace_seq_printf(s, " function=INVALID"); 65 trace_seq_printf(s, " function=INVALID");
73 66
74 func = pevent_find_function(function); 67 func = pevent_find_function(function);
75 68
76 ret += trace_seq_printf(s, " function=%s", func); 69 trace_seq_printf(s, " function=%s", func);
77 } 70 }
78 71
79 ret += trace_seq_printf(s, " expires="); 72 trace_seq_printf(s, " expires=");
80 ret += print_field(s, "%llu", event, "expires", data); 73 print_field(s, "%llu", event, "expires", data);
81 74
82 ret += trace_seq_printf(s, " softexpires="); 75 trace_seq_printf(s, " softexpires=");
83 ret += print_field(s, "%llu", event, "softexpires", data); 76 print_field(s, "%llu", event, "softexpires", data);
84 77
85 return ret; 78 return 0;
86} 79}
87 80
88int PEVENT_PLUGIN_LOADER(void) 81int PEVENT_PLUGIN_LOADER(void)