9 #include <linux/kernel.h>
10 #include <linux/err.h>
11 #include <traceevent/event-parse.h>
12 #include <api/fs/tracing_path.h>
13 #include <api/fs/fs.h>
14 #include "trace-event.h"
19 * global trace_event object used by trace_event__tp_format
21 * TODO There's no cleanup call for this. Add some sort of
22 * __exit function support and call trace_event__cleanup
25 static struct trace_event tevent
;
26 static bool tevent_initialized
;
28 int trace_event__init(struct trace_event
*t
)
30 struct pevent
*pevent
= pevent_alloc();
33 t
->plugin_list
= traceevent_load_plugins(pevent
);
37 return pevent
? 0 : -1;
40 static int trace_event__init2(void)
42 int be
= traceevent_host_bigendian();
43 struct pevent
*pevent
;
45 if (trace_event__init(&tevent
))
48 pevent
= tevent
.pevent
;
49 pevent_set_flag(pevent
, PEVENT_NSEC_OUTPUT
);
50 pevent_set_file_bigendian(pevent
, be
);
51 pevent_set_host_bigendian(pevent
, be
);
52 tevent_initialized
= true;
56 int trace_event__register_resolver(struct machine
*machine
,
57 pevent_func_resolver_t
*func
)
59 if (!tevent_initialized
&& trace_event__init2())
62 return pevent_set_function_resolver(tevent
.pevent
, func
, machine
);
65 void trace_event__cleanup(struct trace_event
*t
)
67 traceevent_unload_plugins(t
->plugin_list
, t
->pevent
);
68 pevent_free(t
->pevent
);
72 * Returns pointer with encoded error via <linux/err.h> interface.
74 static struct event_format
*
75 tp_format(const char *sys
, const char *name
)
77 struct pevent
*pevent
= tevent
.pevent
;
78 struct event_format
*event
= NULL
;
84 scnprintf(path
, PATH_MAX
, "%s/%s/%s/format",
85 tracing_events_path
, sys
, name
);
87 err
= filename__read_str(path
, &data
, &size
);
91 pevent_parse_format(pevent
, &event
, data
, size
, sys
);
98 * Returns pointer with encoded error via <linux/err.h> interface.
101 trace_event__tp_format(const char *sys
, const char *name
)
103 if (!tevent_initialized
&& trace_event__init2())
104 return ERR_PTR(-ENOMEM
);
106 return tp_format(sys
, name
);