]> Pileus Git - ~andy/linux/blobdiff - tools/perf/util/session.c
perf session: Use evlist/evsel for managing perf.data attributes
[~andy/linux] / tools / perf / util / session.c
index a3a871f7bda3f86e526dec506f2471590088b554..f26639fa0fb3a1fd9f2c7376a44a386d5491f49a 100644 (file)
@@ -7,6 +7,8 @@
 #include <sys/types.h>
 #include <sys/mman.h>
 
+#include "evlist.h"
+#include "evsel.h"
 #include "session.h"
 #include "sort.h"
 #include "util.h"
@@ -19,7 +21,7 @@ static int perf_session__open(struct perf_session *self, bool force)
                self->fd_pipe = true;
                self->fd = STDIN_FILENO;
 
-               if (perf_header__read(self, self->fd) < 0)
+               if (perf_session__read_header(self, self->fd) < 0)
                        pr_err("incompatible file format");
 
                return 0;
@@ -51,7 +53,7 @@ static int perf_session__open(struct perf_session *self, bool force)
                goto out_close;
        }
 
-       if (perf_header__read(self, self->fd) < 0) {
+       if (perf_session__read_header(self, self->fd) < 0) {
                pr_err("incompatible file format");
                goto out_close;
        }
@@ -92,21 +94,10 @@ out:
        session->id_hdr_size = size;
 }
 
-void perf_session__set_sample_id_all(struct perf_session *session, bool value)
-{
-       session->sample_id_all = value;
-       perf_session__id_header_size(session);
-}
-
-void perf_session__set_sample_type(struct perf_session *session, u64 type)
-{
-       session->sample_type = type;
-}
-
 void perf_session__update_sample_type(struct perf_session *self)
 {
-       self->sample_type = perf_header__sample_type(&self->header);
-       self->sample_id_all = perf_header__sample_id_all(&self->header);
+       self->sample_type = perf_evlist__sample_type(self->evlist);
+       self->sample_id_all = perf_evlist__sample_id_all(self->evlist);
        perf_session__id_header_size(self);
 }
 
@@ -135,13 +126,9 @@ struct perf_session *perf_session__new(const char *filename, int mode,
        if (self == NULL)
                goto out;
 
-       if (perf_header__init(&self->header) < 0)
-               goto out_free;
-
        memcpy(self->filename, filename, len);
        self->threads = RB_ROOT;
        INIT_LIST_HEAD(&self->dead_threads);
-       self->hists_tree = RB_ROOT;
        self->last_match = NULL;
        /*
         * On 64bit we can mmap the data file in one go. No need for tiny mmap
@@ -162,6 +149,7 @@ struct perf_session *perf_session__new(const char *filename, int mode,
        if (mode == O_RDONLY) {
                if (perf_session__open(self, force) < 0)
                        goto out_delete;
+               perf_session__update_sample_type(self);
        } else if (mode == O_WRONLY) {
                /*
                 * In O_RDONLY mode this will be performed when reading the
@@ -171,8 +159,6 @@ struct perf_session *perf_session__new(const char *filename, int mode,
                        goto out_delete;
        }
 
-       perf_session__update_sample_type(self);
-
        if (ops && ops->ordering_requires_timestamps &&
            ops->ordered_samples && !self->sample_id_all) {
                dump_printf("WARNING: No sample_id_all support, falling back to unordered processing\n");
@@ -181,9 +167,6 @@ struct perf_session *perf_session__new(const char *filename, int mode,
 
 out:
        return self;
-out_free:
-       free(self);
-       return NULL;
 out_delete:
        perf_session__delete(self);
        return NULL;
@@ -214,7 +197,6 @@ static void perf_session__delete_threads(struct perf_session *self)
 
 void perf_session__delete(struct perf_session *self)
 {
-       perf_header__exit(&self->header);
        perf_session__destroy_kernel_maps(self);
        perf_session__delete_dead_threads(self);
        perf_session__delete_threads(self);
@@ -1137,3 +1119,18 @@ size_t perf_session__fprintf_dsos_buildid(struct perf_session *self, FILE *fp,
        size_t ret = machine__fprintf_dsos_buildid(&self->host_machine, fp, with_hits);
        return ret + machines__fprintf_dsos_buildid(&self->machines, fp, with_hits);
 }
+
+size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp)
+{
+       struct perf_evsel *pos;
+       size_t ret = fprintf(fp, "Aggregated stats:\n");
+
+       ret += hists__fprintf_nr_events(&session->hists, fp);
+
+       list_for_each_entry(pos, &session->evlist->entries, node) {
+               ret += fprintf(fp, "%s stats:\n", event_name(pos));
+               ret += hists__fprintf_nr_events(&pos->hists, fp);
+       }
+
+       return ret;
+}