Adding callback function to reader object so
callers can process data in different ways.

Link: http://lkml.kernel.org/n/tip-8g1islzz6xkl36tz0z1nk...@git.kernel.org
Signed-off-by: Jiri Olsa <jo...@kernel.org>
---
 tools/perf/util/session.c | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index de777bdc0ed3..0ec34227bd60 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1847,10 +1847,17 @@ fetch_mmaped_event(struct perf_session *session,
 #define NUM_MMAPS 128
 #endif
 
+struct reader;
+
+typedef s64 (*reader_cb_t)(struct perf_session *session,
+                          union perf_event *event,
+                          u64 file_offset);
+
 struct reader {
-       int     fd;
-       u64     data_size;
-       u64     data_offset;
+       int              fd;
+       u64              data_size;
+       u64              data_offset;
+       reader_cb_t      process;
 };
 
 static int
@@ -1921,7 +1928,7 @@ reader__process_events(struct reader *rd, struct 
perf_session *session,
        size = event->header.size;
 
        if (size < sizeof(struct perf_event_header) ||
-           (skip = perf_session__process_event(session, event, file_pos)) < 0) 
{
+           (skip = rd->process(session, event, file_pos)) < 0) {
                pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n",
                       file_offset + head, event->header.size,
                       event->header.type);
@@ -1947,12 +1954,20 @@ reader__process_events(struct reader *rd, struct 
perf_session *session,
        return err;
 }
 
+static s64 process_simple(struct perf_session *session,
+                         union perf_event *event,
+                         u64 file_offset)
+{
+       return perf_session__process_event(session, event, file_offset);
+}
+
 static int __perf_session__process_events(struct perf_session *session)
 {
        struct reader rd = {
                .fd             = perf_data__fd(session->data),
                .data_size      = session->header.data_size,
                .data_offset    = session->header.data_offset,
+               .process        = process_simple,
        };
        struct ordered_events *oe = &session->ordered_events;
        struct perf_tool *tool = session->tool;
-- 
2.17.2

Reply via email to