perf tools: Librarize sample type and attr finding from headers
authorFrederic Weisbecker <fweisbec@gmail.com>
Sun, 16 Aug 2009 18:56:37 +0000 (20:56 +0200)
committerIngo Molnar <mingo@elte.hu>
Sun, 16 Aug 2009 21:06:44 +0000 (23:06 +0200)
Librarize the sample type and attr fetching from perf data file
headers so that we can also use it from perf trace.

Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
LKML-Reference: <1250448997-30715-1-git-send-email-fweisbec@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
tools/perf/builtin-report.c
tools/perf/util/header.c
tools/perf/util/header.h

index 05d52ff..c6326de 100644 (file)
@@ -70,6 +70,8 @@ static int            cwdlen;
 static struct rb_root  threads;
 static struct thread   *last_match;
 
+static struct perf_header *header;
+
 static
 struct callchain_param callchain_param = {
        .mode   = CHAIN_GRAPH_REL,
@@ -1319,29 +1321,12 @@ static void trace_event(event_t *event)
        dump_printf(".\n");
 }
 
-static struct perf_header      *header;
-
-static struct perf_counter_attr *perf_header__find_attr(u64 id)
-{
-       int i;
-
-       for (i = 0; i < header->attrs; i++) {
-               struct perf_header_attr *attr = header->attr[i];
-               int j;
-
-               for (j = 0; j < attr->ids; j++) {
-                       if (attr->id[j] == id)
-                               return &attr->attr;
-               }
-       }
-
-       return NULL;
-}
-
 static int
 process_read_event(event_t *event, unsigned long offset, unsigned long head)
 {
-       struct perf_counter_attr *attr = perf_header__find_attr(event->read.id);
+       struct perf_counter_attr *attr;
+
+       attr = perf_header__find_attr(event->read.id, header);
 
        if (show_threads) {
                const char *name = attr ? __event_name(attr->type, attr->config)
@@ -1405,23 +1390,6 @@ process_event(event_t *event, unsigned long offset, unsigned long head)
        return 0;
 }
 
-static u64 perf_header__sample_type(void)
-{
-       u64 type = 0;
-       int i;
-
-       for (i = 0; i < header->attrs; i++) {
-               struct perf_header_attr *attr = header->attr[i];
-
-               if (!type)
-                       type = attr->attr.sample_type;
-               else if (type != attr->attr.sample_type)
-                       die("non matching sample_type");
-       }
-
-       return type;
-}
-
 static int __cmd_report(void)
 {
        int ret, rc = EXIT_FAILURE;
@@ -1460,7 +1428,7 @@ static int __cmd_report(void)
        header = perf_header__read(input);
        head = header->data_offset;
 
-       sample_type = perf_header__sample_type();
+       sample_type = perf_header__sample_type(header);
 
        if (!(sample_type & PERF_SAMPLE_CALLCHAIN)) {
                if (sort__has_parent) {
index b92a457..a37a222 100644 (file)
@@ -243,3 +243,38 @@ struct perf_header *perf_header__read(int fd)
 
        return self;
 }
+
+u64 perf_header__sample_type(struct perf_header *header)
+{
+       u64 type = 0;
+       int i;
+
+       for (i = 0; i < header->attrs; i++) {
+               struct perf_header_attr *attr = header->attr[i];
+
+               if (!type)
+                       type = attr->attr.sample_type;
+               else if (type != attr->attr.sample_type)
+                       die("non matching sample_type");
+       }
+
+       return type;
+}
+
+struct perf_counter_attr *
+perf_header__find_attr(u64 id, struct perf_header *header)
+{
+       int i;
+
+       for (i = 0; i < header->attrs; i++) {
+               struct perf_header_attr *attr = header->attr[i];
+               int j;
+
+               for (j = 0; j < attr->ids; j++) {
+                       if (attr->id[j] == id)
+                               return &attr->attr;
+               }
+       }
+
+       return NULL;
+}
index bf28044..5d0a72e 100644 (file)
@@ -31,6 +31,10 @@ struct perf_header_attr *
 perf_header_attr__new(struct perf_counter_attr *attr);
 void perf_header_attr__add_id(struct perf_header_attr *self, u64 id);
 
+u64 perf_header__sample_type(struct perf_header *header);
+struct perf_counter_attr *
+perf_header__find_attr(u64 id, struct perf_header *header);
+
 
 struct perf_header *perf_header__new(void);