From 58a98c9cc583435784a93f23754128363b4cca94 Mon Sep 17 00:00:00 2001 From: Adrian Hunter Date: Tue, 10 Dec 2013 11:11:46 -0300 Subject: [PATCH] perf symbols: Remove open coded management of short_name_allocated member Instead of expecting callers to set this member accodingly so that later at dso destruction it can, if needed, be correctly free()d, make it a requirement by passing it as a parameter to dso__set_short_name. Cc: Andi Kleen Cc: David Ahern Cc: Dongsheng Yang Cc: Frederic Weisbecker CC: Ingo Molnar Cc: Jiri Olsa Cc: Mike Galbraith Cc: Namhyung Kim Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Steven Rostedt Signed-off-by: Adrian Hunter Link: http://lkml.kernel.org/r/52A707A2.5020802@intel.com [ Renamed the 'allocated' parameter to clearly indicate to which variable it refers to. ] Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/dso.c | 17 +++++++++++------ tools/perf/util/dso.h | 2 +- tools/perf/util/machine.c | 3 +-- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index 55c983586b05..f8c849767c4d 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c @@ -379,7 +379,7 @@ struct dso *dso__kernel_findnew(struct machine *machine, const char *name, * processing we had no idea this was the kernel dso. */ if (dso != NULL) { - dso__set_short_name(dso, short_name); + dso__set_short_name(dso, short_name, false); dso->kernel = dso_type; } @@ -394,17 +394,22 @@ void dso__set_long_name(struct dso *dso, char *name) dso->long_name_len = strlen(name); } -void dso__set_short_name(struct dso *dso, const char *name) +void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated) { if (name == NULL) return; - dso->short_name = name; - dso->short_name_len = strlen(name); + + if (dso->short_name_allocated) + free((char *)dso->short_name); + + dso->short_name = name; + dso->short_name_len = strlen(name); + dso->short_name_allocated = name_allocated; } static void dso__set_basename(struct dso *dso) { - dso__set_short_name(dso, basename(dso->long_name)); + dso__set_short_name(dso, basename(dso->long_name), false); } int dso__name_len(const struct dso *dso) @@ -440,7 +445,7 @@ struct dso *dso__new(const char *name) int i; strcpy(dso->name, name); dso__set_long_name(dso, dso->name); - dso__set_short_name(dso, dso->name); + dso__set_short_name(dso, dso->name, false); for (i = 0; i < MAP__NR_TYPES; ++i) dso->symbols[i] = dso->symbol_names[i] = RB_ROOT; dso->cache = RB_ROOT; diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h index 00a232d89607..8eceab78088f 100644 --- a/tools/perf/util/dso.h +++ b/tools/perf/util/dso.h @@ -110,7 +110,7 @@ static inline void dso__set_loaded(struct dso *dso, enum map_type type) struct dso *dso__new(const char *name); void dso__delete(struct dso *dso); -void dso__set_short_name(struct dso *dso, const char *name); +void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated); void dso__set_long_name(struct dso *dso, char *name); int dso__name_len(const struct dso *dso); diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index f85da9a9a5d9..09d5c66d4087 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -935,8 +935,7 @@ static int machine__process_kernel_mmap_event(struct machine *machine, if (name == NULL) goto out_problem; - dso__set_short_name(map->dso, name); - map->dso->short_name_allocated = 1; + dso__set_short_name(map->dso, name, true); map->end = map->start + event->mmap.len; } else if (is_kernel_mmap) { const char *symbol_name = (event->mmap.filename +