perf hist: Make event__totals per hists
[safe/jmp/linux-2.6] / tools / perf / util / session.h
index 61ca92e..e7fce48 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef __PERF_SESSION_H
 #define __PERF_SESSION_H
 
+#include "hist.h"
 #include "event.h"
 #include "header.h"
 #include "symbol.h"
@@ -14,7 +15,8 @@ struct thread;
 
 struct ordered_samples {
        u64                     last_flush;
-       u64                     flush_limit;
+       u64                     next_flush;
+       u64                     max_timestamp;
        struct list_head        samples_head;
        struct sample_queue     *last_inserted;
 };
@@ -25,41 +27,51 @@ struct perf_session {
        unsigned long           mmap_window;
        struct rb_root          threads;
        struct thread           *last_match;
+       struct machine          host_machine;
        struct rb_root          machines;
-       struct events_stats     events_stats;
-       struct rb_root          stats_by_id;
-       unsigned long           event_total[PERF_RECORD_MAX];
-       unsigned long           unknown_events;
-       struct rb_root          hists;
+       struct rb_root          hists_tree;
+       /*
+        * FIXME: should point to the first entry in hists_tree and
+        *        be a hists instance. Right now its only 'report'
+        *        that is using ->hists_tree while all the rest use
+        *        ->hists.
+        */
+       struct hists            hists;
        u64                     sample_type;
        int                     fd;
        bool                    fd_pipe;
+       bool                    repipe;
        int                     cwdlen;
        char                    *cwd;
        struct ordered_samples  ordered_samples;
        char filename[0];
 };
 
+struct perf_event_ops;
+
 typedef int (*event_op)(event_t *self, struct perf_session *session);
+typedef int (*event_op2)(event_t *self, struct perf_session *session,
+                        struct perf_event_ops *ops);
 
 struct perf_event_ops {
-       event_op sample,
-                mmap,
-                comm,
-                fork,
-                exit,
-                lost,
-                read,
-                throttle,
-                unthrottle,
-                attr,
-                event_type,
-                tracing_data,
-                build_id;
-       bool    ordered_samples;
+       event_op        sample,
+                       mmap,
+                       comm,
+                       fork,
+                       exit,
+                       lost,
+                       read,
+                       throttle,
+                       unthrottle,
+                       attr,
+                       event_type,
+                       tracing_data,
+                       build_id;
+       event_op2       finished_round;
+       bool            ordered_samples;
 };
 
-struct perf_session *perf_session__new(const char *filename, int mode, bool force);
+struct perf_session *perf_session__new(const char *filename, int mode, bool force, bool repipe);
 void perf_session__delete(struct perf_session *self);
 
 void perf_event_header__bswap(struct perf_event_header *self);
@@ -88,36 +100,25 @@ int perf_session__create_kernel_maps(struct perf_session *self);
 int do_read(int fd, void *buf, size_t size);
 void perf_session__update_sample_type(struct perf_session *self);
 
-#ifdef NO_NEWT_SUPPORT
-static inline int perf_session__browse_hists(struct rb_root *hists __used,
-                                             u64 nr_hists __used,
-                                             u64 session_total __used,
-                                            const char *helpline __used,
-                                            const char *input_name __used)
-{
-       return 0;
-}
-#else
-int perf_session__browse_hists(struct rb_root *hists, u64 nr_hists,
-                              u64 session_total, const char *helpline,
-                              const char *input_name);
-#endif
-
 static inline
 struct machine *perf_session__find_host_machine(struct perf_session *self)
 {
-       return machines__find_host(&self->machines);
+       return &self->host_machine;
 }
 
 static inline
 struct machine *perf_session__find_machine(struct perf_session *self, pid_t pid)
 {
+       if (pid == HOST_KERNEL_ID)
+               return &self->host_machine;
        return machines__find(&self->machines, pid);
 }
 
 static inline
 struct machine *perf_session__findnew_machine(struct perf_session *self, pid_t pid)
 {
+       if (pid == HOST_KERNEL_ID)
+               return &self->host_machine;
        return machines__findnew(&self->machines, pid);
 }
 
@@ -125,14 +126,11 @@ static inline
 void perf_session__process_machines(struct perf_session *self,
                                    machine__process_t process)
 {
+       process(&self->host_machine, self);
        return machines__process(&self->machines, process, self);
 }
 
-static inline
-size_t perf_session__fprintf_dsos(struct perf_session *self, FILE *fp)
-{
-       return machines__fprintf_dsos(&self->machines, fp);
-}
+size_t perf_session__fprintf_dsos(struct perf_session *self, FILE *fp);
 
 static inline
 size_t perf_session__fprintf_dsos_buildid(struct perf_session *self, FILE *fp,
@@ -140,4 +138,10 @@ size_t perf_session__fprintf_dsos_buildid(struct perf_session *self, FILE *fp,
 {
        return machines__fprintf_dsos_buildid(&self->machines, fp, with_hits);
 }
+
+static inline
+size_t perf_session__fprintf_nr_events(struct perf_session *self, FILE *fp)
+{
+       return hists__fprintf_nr_events(&self->hists, fp);
+}
 #endif /* __PERF_SESSION_H */