diff options
Diffstat (limited to 'tools/perf/util/session.c')
-rw-r--r-- | tools/perf/util/session.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 6b305fbcc986..f5baff1495e6 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include "sort.h" | 14 | #include "sort.h" |
15 | #include "util.h" | 15 | #include "util.h" |
16 | #include "cpumap.h" | 16 | #include "cpumap.h" |
17 | #include "event-parse.h" | ||
17 | 18 | ||
18 | static int perf_session__open(struct perf_session *self, bool force) | 19 | static int perf_session__open(struct perf_session *self, bool force) |
19 | { | 20 | { |
@@ -1610,3 +1611,58 @@ void perf_session__fprintf_info(struct perf_session *session, FILE *fp, | |||
1610 | perf_header__fprintf_info(session, fp, full); | 1611 | perf_header__fprintf_info(session, fp, full); |
1611 | fprintf(fp, "# ========\n#\n"); | 1612 | fprintf(fp, "# ========\n#\n"); |
1612 | } | 1613 | } |
1614 | |||
1615 | |||
1616 | int __perf_session__set_tracepoints_handlers(struct perf_session *session, | ||
1617 | const struct perf_evsel_str_handler *assocs, | ||
1618 | size_t nr_assocs) | ||
1619 | { | ||
1620 | struct perf_evlist *evlist = session->evlist; | ||
1621 | struct event_format *format; | ||
1622 | struct perf_evsel *evsel; | ||
1623 | char *tracepoint, *name; | ||
1624 | size_t i; | ||
1625 | int err; | ||
1626 | |||
1627 | for (i = 0; i < nr_assocs; i++) { | ||
1628 | err = -ENOMEM; | ||
1629 | tracepoint = strdup(assocs[i].name); | ||
1630 | if (tracepoint == NULL) | ||
1631 | goto out; | ||
1632 | |||
1633 | err = -ENOENT; | ||
1634 | name = strchr(tracepoint, ':'); | ||
1635 | if (name == NULL) | ||
1636 | goto out_free; | ||
1637 | |||
1638 | *name++ = '\0'; | ||
1639 | format = pevent_find_event_by_name(session->pevent, | ||
1640 | tracepoint, name); | ||
1641 | if (format == NULL) { | ||
1642 | /* | ||
1643 | * Adding a handler for an event not in the session, | ||
1644 | * just ignore it. | ||
1645 | */ | ||
1646 | goto next; | ||
1647 | } | ||
1648 | |||
1649 | evsel = perf_evlist__find_tracepoint_by_id(evlist, format->id); | ||
1650 | if (evsel == NULL) | ||
1651 | goto next; | ||
1652 | |||
1653 | err = -EEXIST; | ||
1654 | if (evsel->handler.func != NULL) | ||
1655 | goto out_free; | ||
1656 | evsel->handler.func = assocs[i].handler; | ||
1657 | next: | ||
1658 | free(tracepoint); | ||
1659 | } | ||
1660 | |||
1661 | err = 0; | ||
1662 | out: | ||
1663 | return err; | ||
1664 | |||
1665 | out_free: | ||
1666 | free(tracepoint); | ||
1667 | goto out; | ||
1668 | } | ||