perf symbols: Precisely specify if dso->{long,short}_name should be freed
Arnaldo Carvalho de Melo [Thu, 29 Jul 2010 18:11:30 +0000 (15:11 -0300)]
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>

tools/perf/util/event.c
tools/perf/util/symbol.c
tools/perf/util/symbol.h

index 5b81bb2..8151d23 100644 (file)
@@ -456,6 +456,7 @@ static int event__process_kernel_mmap(event_t *self,
                        goto out_problem;
 
                map->dso->short_name = name;
+               map->dso->sname_alloc = 1;
                map->end = map->start + self->mmap.len;
        } else if (is_kernel_mmap) {
                const char *symbol_name = (self->mmap.filename +
index bc6e7e8..242d2b2 100644 (file)
@@ -224,7 +224,9 @@ void dso__delete(struct dso *self)
        int i;
        for (i = 0; i < MAP__NR_TYPES; ++i)
                symbols__delete(&self->symbols[i]);
-       if (self->long_name != self->name)
+       if (self->sname_alloc)
+               free((char *)self->short_name);
+       if (self->lname_alloc)
                free(self->long_name);
        free(self);
 }
@@ -1530,6 +1532,7 @@ static int map_groups__set_modules_path_dir(struct map_groups *self,
                        if (long_name == NULL)
                                goto failure;
                        dso__set_long_name(map->dso, long_name);
+                       map->dso->lname_alloc = 1;
                        dso__kernel_module_get_build_id(map->dso, "");
                }
        }
index 6452a07..f29f73c 100644 (file)
@@ -126,12 +126,14 @@ struct dso {
        struct list_head node;
        struct rb_root   symbols[MAP__NR_TYPES];
        struct rb_root   symbol_names[MAP__NR_TYPES];
+       enum dso_kernel_type    kernel;
        u8               adjust_symbols:1;
        u8               slen_calculated:1;
        u8               has_build_id:1;
-       enum dso_kernel_type    kernel;
        u8               hit:1;
        u8               annotate_warned:1;
+       u8               sname_alloc:1;
+       u8               lname_alloc:1;
        unsigned char    origin;
        u8               sorted_by_name;
        u8               loaded;