aboutsummaryrefslogtreecommitdiff
path: root/perf
diff options
context:
space:
mode:
authorArjan van de Ven <arjan@linux.intel.com>2010-08-09 13:21:32 -0400
committerArjan van de Ven <arjan@linux.intel.com>2010-08-09 13:21:32 -0400
commitc8089be3f04d986146ebb1429ff482569b5e6588 (patch)
treeec090f268eb2ae5a53201e26bed3c724bdd96489 /perf
parent17e597bae7fdab04de26adbdd31cec23c52e932c (diff)
downloadpowertop-c8089be3f04d986146ebb1429ff482569b5e6588.tar.gz
more perf work
Diffstat (limited to 'perf')
-rw-r--r--perf/perf.cpp52
-rw-r--r--perf/perf.h6
2 files changed, 57 insertions, 1 deletions
diff --git a/perf/perf.cpp b/perf/perf.cpp
index 5e963c6..d99dc08 100644
--- a/perf/perf.cpp
+++ b/perf/perf.cpp
@@ -84,6 +84,9 @@ void perf_event::create_perf_event(char *eventname)
__u64 id;
} read_data;
+ if (perf_fd != -1)
+ clear();
+
memset(&attr, 0, sizeof(attr));
attr.read_format = PERF_FORMAT_TOTAL_TIME_ENABLED |
@@ -136,7 +139,7 @@ void perf_event::create_perf_event(char *eventname)
}
-perf_event::perf_event(const char *event_name, int buffer_size)
+void perf_event::set_event_name(const char *event_name)
{
name = strdup(event_name);
char *c;
@@ -146,12 +149,59 @@ perf_event::perf_event(const char *event_name, int buffer_size)
*c = '/';
trace_type = get_trace_type(name);
+}
+
+perf_event::perf_event(const char *event_name, int buffer_size)
+{
+ set_event_name(event_name);
bufsize = buffer_size;
}
+void perf_event::start(void)
+{
+ create_perf_event(name);
+}
+
+void perf_event::stop(void)
+{
+ ioctl(perf_fd, PERF_EVENT_IOC_DISABLE);
+}
+
+void perf_event::process(void)
+{
+ struct perf_event_header *header;
+ int i = 0;
+
+ if (perf_fd < 0)
+ return;
+
+ while (pc->data_tail != pc->data_head && i++ < 5000) {
+ while (pc->data_tail >= (unsigned int)bufsize * getpagesize())
+ pc->data_tail -= bufsize * getpagesize();
+
+ header = (struct perf_event_header *)( (unsigned char *)data_mmap + pc->data_tail);
+
+ if (header->size == 0)
+ break;
+ pc->data_tail += header->size;
+ while (pc->data_tail >= (unsigned int)bufsize * getpagesize())
+ pc->data_tail -= bufsize * getpagesize();
+
+ if (header->type == PERF_RECORD_SAMPLE)
+ handle_event(header);
+ }
+ pc->data_tail = pc->data_head;
+}
+
+void perf_event::clear(void)
+{
+ munmap(perf_mmap, (bufsize+1)*getpagesize());
+ close(perf_fd);
+ perf_fd = -1;
+}
diff --git a/perf/perf.h b/perf/perf.h
index 0d6c63e..db3c3ef 100644
--- a/perf/perf.h
+++ b/perf/perf.h
@@ -17,7 +17,13 @@ protected:
public:
perf_event(const char *event_name, int buffer_size = 128);
+ void set_event_name(const char *event_name);
void start(void);
void stop(void);
+ void clear(void);
+
+ void process(void);
+
+ virtual void handle_event(struct perf_event_header *header) { };
};