Skip to content

Commit

Permalink
perf tools: Librarize sample type and attr finding from headers
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Frederic Weisbecker authored and Ingo Molnar committed Aug 16, 2009
1 parent 0f25bfc commit 0d3a5c8
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 38 deletions.
44 changes: 6 additions & 38 deletions tools/perf/builtin-report.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down
35 changes: 35 additions & 0 deletions tools/perf/util/header.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
4 changes: 4 additions & 0 deletions tools/perf/util/header.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit 0d3a5c8

Please sign in to comment.