Messages in this thread Patch in this message | | | From | Tom Zanussi <> | Subject | [RFC][PATCH 4/9] perf trace: Add trace scripting ops | Date | Tue, 6 Oct 2009 01:09:53 -0500 |
| |
Support any number of scripting languages for trace stream processing by adding a set of functions, trace_scripting_operations, that can be implemented to support a given language.
- start_script() - initialize e.g. create and initialize the interpreter - stop_script() - clean up e.g. destroy the interpreter - process_event() - send each event and its data to the interpreter
Support for a given language should also modify setup_scripting() to replace the do-nothing default_scripting_ops with the language-specific scripting ops for that language.
Signed-off-by: Tom Zanussi <tzanussi@gmail.com> --- tools/perf/builtin-trace.c | 53 +++++++++++++++++++++++++++++++++++++++- tools/perf/util/trace-event.h | 7 +++++ 2 files changed, 58 insertions(+), 2 deletions(-)
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 5d4c84d..a654a5a 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -27,6 +27,37 @@ static struct thread *last_match; static struct perf_header *header; static u64 sample_type; +static char const *script_name; + +static int default_start_script(const char *script __attribute((unused))) +{ + return 0; +} + +static int default_stop_script(void) +{ + return 0; +} + +static struct trace_scripting_operations default_scripting_ops = { + .start_script = default_start_script, + .stop_script = default_stop_script, + .process_event = print_event, +}; + +static struct trace_scripting_operations *scripting_ops; + +static int setup_scripting(const char *script __attribute((unused))) +{ + scripting_ops = &default_scripting_ops; + + return 0; +} + +static int cleanup_scripting(void) +{ + return scripting_ops->stop_script(); +} static int process_comm_event(event_t *event, unsigned long offset, unsigned long head) @@ -105,7 +136,8 @@ process_sample_event(event_t *event, unsigned long offset, unsigned long head) * field, although it should be the same than this perf * event pid */ - print_event(cpu, raw->data, raw->size, timestamp, thread->comm); + scripting_ops->process_event(cpu, raw->data, raw->size, + timestamp, thread->comm); } total += period; @@ -239,11 +271,15 @@ static const struct option options[] = { "dump raw trace in ASCII"), OPT_BOOLEAN('v', "verbose", &verbose, "be more verbose (show symbol address, etc)"), + OPT_STRING('s', "script", &script_name, "file", + "script file name"), OPT_END() }; int cmd_trace(int argc, const char **argv, const char *prefix __used) { + int err; + symbol__init(); page_size = getpagesize(); @@ -259,5 +295,18 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) setup_pager(); - return __cmd_trace(); + err = setup_scripting(script_name); + if (err) + goto out; + + if (script_name) { + err = scripting_ops->start_script(script_name); + goto out; + } + + err = __cmd_trace(); + + cleanup_scripting(); +out: + return err; } diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h index 5f59a39..449c23d 100644 --- a/tools/perf/util/trace-event.h +++ b/tools/perf/util/trace-event.h @@ -246,4 +246,11 @@ void *raw_field_ptr(struct event *event, const char *name, void *data); void read_tracing_data(struct perf_event_attr *pattrs, int nb_events); +struct trace_scripting_operations { + int (*start_script) (const char *); + int (*stop_script) (void); + void (*process_event) (int cpu, void *data, int size, + unsigned long long nsecs, char *comm); +}; + #endif /* __PERF_TRACE_EVENTS_H */ -- 1.6.4.GIT
| |