Skip to content

Commit

Permalink
perf tools: Release session and symbol resources on exit
Browse files Browse the repository at this point in the history
So that we reduce the noise when looking for leaks using tools such as
valgrind.

Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
LKML-Reference: <new-submission>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Arnaldo Carvalho de Melo committed Jul 30, 2010
1 parent 591765f commit d65a458
Show file tree
Hide file tree
Showing 7 changed files with 70 additions and 3 deletions.
5 changes: 4 additions & 1 deletion tools/perf/builtin-record.c
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,7 @@ static void atexit_header(void)
process_buildids();
perf_header__write(&session->header, output, true);
perf_session__delete(session);
symbol__exit();
}
}

Expand Down Expand Up @@ -871,7 +872,7 @@ int cmd_record(int argc, const char **argv, const char *prefix __used)
} else {
all_tids=malloc(sizeof(pid_t));
if (!all_tids)
return -ENOMEM;
goto out_symbol_exit;

all_tids[0] = target_tid;
thread_num = 1;
Expand Down Expand Up @@ -918,5 +919,7 @@ int cmd_record(int argc, const char **argv, const char *prefix __used)
}
free(all_tids);
all_tids = NULL;
out_symbol_exit:
symbol__exit();
return err;
}
5 changes: 3 additions & 2 deletions tools/perf/util/event.c
Original file line number Diff line number Diff line change
Expand Up @@ -515,12 +515,13 @@ int event__process_mmap(event_t *self, struct perf_session *session)
if (machine == NULL)
goto out_problem;
thread = perf_session__findnew(session, self->mmap.pid);
if (thread == NULL)
goto out_problem;
map = map__new(&machine->user_dsos, self->mmap.start,
self->mmap.len, self->mmap.pgoff,
self->mmap.pid, self->mmap.filename,
MAP__FUNCTION);

if (thread == NULL || map == NULL)
if (map == NULL)
goto out_problem;

thread__insert_map(thread, map);
Expand Down
26 changes: 26 additions & 0 deletions tools/perf/util/map.c
Original file line number Diff line number Diff line change
Expand Up @@ -539,6 +539,32 @@ int machine__init(struct machine *self, const char *root_dir, pid_t pid)
return self->root_dir == NULL ? -ENOMEM : 0;
}

static void dsos__delete(struct list_head *self)
{
struct dso *pos, *n;

list_for_each_entry_safe(pos, n, self, node) {
list_del(&pos->node);
dso__delete(pos);
}
}

void machine__exit(struct machine *self)
{
struct kmap *kmap = map__kmap(self->vmlinux_maps[MAP__FUNCTION]);

if (kmap->ref_reloc_sym) {
free((char *)kmap->ref_reloc_sym->name);
free(kmap->ref_reloc_sym);
}

map_groups__exit(&self->kmaps);
dsos__delete(&self->user_dsos);
dsos__delete(&self->kernel_dsos);
free(self->root_dir);
self->root_dir = NULL;
}

struct machine *machines__add(struct rb_root *self, pid_t pid,
const char *root_dir)
{
Expand Down
1 change: 1 addition & 0 deletions tools/perf/util/map.h
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ struct machine *machines__find(struct rb_root *self, pid_t pid);
struct machine *machines__findnew(struct rb_root *self, pid_t pid);
char *machine__mmap_name(struct machine *self, char *bf, size_t size);
int machine__init(struct machine *self, const char *root_dir, pid_t pid);
void machine__exit(struct machine *self);

/*
* Default guest kernel is defined by parameter --guestkallsyms
Expand Down
26 changes: 26 additions & 0 deletions tools/perf/util/session.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,9 +124,35 @@ struct perf_session *perf_session__new(const char *filename, int mode, bool forc
return NULL;
}

static void perf_session__delete_dead_threads(struct perf_session *self)
{
struct thread *n, *t;

list_for_each_entry_safe(t, n, &self->dead_threads, node) {
list_del(&t->node);
thread__delete(t);
}
}

static void perf_session__delete_threads(struct perf_session *self)
{
struct rb_node *nd = rb_first(&self->threads);

while (nd) {
struct thread *t = rb_entry(nd, struct thread, rb_node);

rb_erase(&t->rb_node, &self->threads);
nd = rb_next(nd);
thread__delete(t);
}
}

void perf_session__delete(struct perf_session *self)
{
perf_header__exit(&self->header);
perf_session__delete_dead_threads(self);
perf_session__delete_threads(self);
machine__exit(&self->host_machine);
close(self->fd);
free(self);
}
Expand Down
9 changes: 9 additions & 0 deletions tools/perf/util/symbol.c
Original file line number Diff line number Diff line change
Expand Up @@ -2245,6 +2245,15 @@ int symbol__init(void)
return -1;
}

void symbol__exit(void)
{
strlist__delete(symbol_conf.sym_list);
strlist__delete(symbol_conf.dso_list);
strlist__delete(symbol_conf.comm_list);
vmlinux_path__exit();
symbol_conf.sym_list = symbol_conf.dso_list = symbol_conf.comm_list = NULL;
}

int machines__create_kernel_maps(struct rb_root *self, pid_t pid)
{
struct machine *machine = machines__findnew(self, pid);
Expand Down
1 change: 1 addition & 0 deletions tools/perf/util/symbol.h
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,7 @@ int machines__create_kernel_maps(struct rb_root *self, pid_t pid);
int machines__create_guest_kernel_maps(struct rb_root *self);

int symbol__init(void);
void symbol__exit(void);
bool symbol_type__is_a(char symbol_type, enum map_type map_type);

size_t machine__fprintf_vmlinux_path(struct machine *self, FILE *fp);
Expand Down

0 comments on commit d65a458

Please sign in to comment.