diff options
author | Arjan van de Ven <arjan@linux.intel.com> | 2010-08-09 13:21:32 -0400 |
---|---|---|
committer | Arjan van de Ven <arjan@linux.intel.com> | 2010-08-09 13:21:32 -0400 |
commit | c8089be3f04d986146ebb1429ff482569b5e6588 (patch) | |
tree | ec090f268eb2ae5a53201e26bed3c724bdd96489 /perf | |
parent | 17e597bae7fdab04de26adbdd31cec23c52e932c (diff) | |
download | powertop-c8089be3f04d986146ebb1429ff482569b5e6588.tar.gz |
more perf work
Diffstat (limited to 'perf')
-rw-r--r-- | perf/perf.cpp | 52 | ||||
-rw-r--r-- | perf/perf.h | 6 |
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) { }; }; |