diff options
Diffstat (limited to 'tools/perf/util/scripting-engines/trace-event-perl.c')
| -rw-r--r-- | tools/perf/util/scripting-engines/trace-event-perl.c | 29 | 
1 files changed, 6 insertions, 23 deletions
diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c index 0a01bac4ce02..22ebc46226e7 100644 --- a/tools/perf/util/scripting-engines/trace-event-perl.c +++ b/tools/perf/util/scripting-engines/trace-event-perl.c @@ -24,6 +24,7 @@  #include <string.h>  #include <ctype.h>  #include <errno.h> +#include <linux/bitmap.h>  #include "../util.h"  #include <EXTERN.h> @@ -57,7 +58,7 @@ INTERP my_perl;  #define FTRACE_MAX_EVENT				\  	((1 << (sizeof(unsigned short) * 8)) - 1) -struct event_format *events[FTRACE_MAX_EVENT]; +static DECLARE_BITMAP(events_defined, FTRACE_MAX_EVENT);  extern struct scripting_context *scripting_context; @@ -238,35 +239,15 @@ static void define_event_symbols(struct event_format *event,  		define_event_symbols(event, ev_name, args->next);  } -static inline struct event_format *find_cache_event(struct perf_evsel *evsel) -{ -	static char ev_name[256]; -	struct event_format *event; -	int type = evsel->attr.config; - -	if (events[type]) -		return events[type]; - -	events[type] = event = evsel->tp_format; -	if (!event) -		return NULL; - -	sprintf(ev_name, "%s::%s", event->system, event->name); - -	define_event_symbols(event, ev_name, event->print_fmt.args); - -	return event; -} -  static void perl_process_tracepoint(struct perf_sample *sample,  				    struct perf_evsel *evsel,  				    struct thread *thread)  { +	struct event_format *event = evsel->tp_format;  	struct format_field *field;  	static char handler[256];  	unsigned long long val;  	unsigned long s, ns; -	struct event_format *event;  	int pid;  	int cpu = sample->cpu;  	void *data = sample->raw_data; @@ -278,7 +259,6 @@ static void perl_process_tracepoint(struct perf_sample *sample,  	if (evsel->attr.type != PERF_TYPE_TRACEPOINT)  		return; -	event = find_cache_event(evsel);  	if (!event)  		die("ug! no event found for type %" PRIu64, (u64)evsel->attr.config); @@ -286,6 +266,9 @@ static void perl_process_tracepoint(struct perf_sample *sample,  	sprintf(handler, "%s::%s", event->system, event->name); +	if (!test_and_set_bit(event->id, events_defined)) +		define_event_symbols(event, handler, event->print_fmt.args); +  	s = nsecs / NSECS_PER_SEC;  	ns = nsecs - s * NSECS_PER_SEC;  | 
