diff options
Diffstat (limited to 'tools/perf/util/evsel.c')
-rw-r--r-- | tools/perf/util/evsel.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 876f639d69ed..45d1e4883715 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -15,8 +15,14 @@ #include "cpumap.h" #include "thread_map.h" #include "target.h" +#include "parse-events-flex.h" #include "../../include/linux/perf_event.h" +#ifdef PARSER_DEBUG +extern int parse_events_debug; +#endif +int parse_events_parse(struct list_head *list, int *idx); + #define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) #define GROUP_FD(group_fd, cpu) (*(int *)xyarray__entry(group_fd, cpu, 0)) @@ -46,6 +52,42 @@ void hists__init(struct hists *hists) pthread_mutex_init(&hists->lock, NULL); } +struct perf_evsel *perf_evsel__new2(const char *str) +{ + struct perf_evsel *evsel, *n; + LIST_HEAD(list); + LIST_HEAD(list_tmp); + int ret, idx = 0; + YY_BUFFER_STATE buffer = parse_events__scan_string(str); + +#ifdef PARSER_DEBUG + parse_events_debug = 1; +#endif + ret = parse_events_parse(&list, &idx); + + parse_events__flush_buffer(buffer); + parse_events__delete_buffer(buffer); + parse_events_lex_destroy(); + + if (ret) + goto out_err; + + if (idx > 1) + goto out_delete_list; + + evsel = list_entry(list.next, struct perf_evsel, node); + list_del_init(&evsel->node); + return evsel; + +out_delete_list: + list_for_each_entry_safe(evsel, n, &list, node) { + list_del_init(&evsel->node); + perf_evsel__delete(evsel); + } +out_err: + return NULL; +} + void perf_evsel__init(struct perf_evsel *evsel, struct perf_event_attr *attr, int idx) { |