perf tools: Introduce zfree For the frequent idiom of: free(ptr); ptr = NULL; Make it expect a pointer to the pointer being freed, so that it becomes clear at first sight that the variable being freed is being modified. Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-pfw02ezuab37kha18wlut7ir@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
diff --git a/tools/perf/arch/common.c b/tools/perf/arch/common.c index aacef07..42faf36 100644 --- a/tools/perf/arch/common.c +++ b/tools/perf/arch/common.c
@@ -154,8 +154,7 @@ } if (lookup_path(buf)) goto out; - free(buf); - buf = NULL; + zfree(&buf); } if (!strcmp(arch, "arm"))
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c index 4136f99..ab65057 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c
@@ -180,8 +180,7 @@ * symbol, free he->ms.sym->src to signal we already * processed this symbol. */ - free(notes->src); - notes->src = NULL; + zfree(¬es->src); } } }
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index dab98b5..106a5e5 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c
@@ -185,8 +185,7 @@ static void perf_evsel__free_stat_priv(struct perf_evsel *evsel) { - free(evsel->priv); - evsel->priv = NULL; + zfree(&evsel->priv); } static int perf_evsel__alloc_prev_raw_counts(struct perf_evsel *evsel) @@ -208,8 +207,7 @@ static void perf_evsel__free_prev_raw_counts(struct perf_evsel *evsel) { - free(evsel->prev_raw_counts); - evsel->prev_raw_counts = NULL; + zfree(&evsel->prev_raw_counts); } static void perf_evlist__free_stats(struct perf_evlist *evlist)
diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c index 20d4212..652af0b 100644 --- a/tools/perf/builtin-timechart.c +++ b/tools/perf/builtin-timechart.c
@@ -488,8 +488,7 @@ * It seems the callchain is corrupted. * Discard all. */ - free(p); - p = NULL; + zfree(&p); goto exit; } continue;
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index f64b5b0..c5b4bc5 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c
@@ -146,8 +146,7 @@ static void perf_evsel__delete_priv(struct perf_evsel *evsel) { - free(evsel->priv); - evsel->priv = NULL; + zfree(&evsel->priv); perf_evsel__delete(evsel); } @@ -165,8 +164,7 @@ return -ENOMEM; out_delete: - free(evsel->priv); - evsel->priv = NULL; + zfree(&evsel->priv); return -ENOENT; } @@ -1278,10 +1276,8 @@ size_t printed = syscall_arg__scnprintf_fd(bf, size, arg); struct thread_trace *ttrace = arg->thread->priv; - if (ttrace && fd >= 0 && fd <= ttrace->paths.max) { - free(ttrace->paths.table[fd]); - ttrace->paths.table[fd] = NULL; - } + if (ttrace && fd >= 0 && fd <= ttrace->paths.max) + zfree(&ttrace->paths.table[fd]); return printed; }
diff --git a/tools/perf/ui/browser.c b/tools/perf/ui/browser.c index 94223d40..d11541d 100644 --- a/tools/perf/ui/browser.c +++ b/tools/perf/ui/browser.c
@@ -256,8 +256,7 @@ __ui_browser__show_title(browser, title); browser->title = title; - free(browser->helpline); - browser->helpline = NULL; + zfree(&browser->helpline); va_start(ap, helpline); err = vasprintf(&browser->helpline, helpline, ap); @@ -272,8 +271,7 @@ { pthread_mutex_lock(&ui__lock); ui_helpline__pop(); - free(browser->helpline); - browser->helpline = NULL; + zfree(&browser->helpline); pthread_mutex_unlock(&ui__lock); }
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index 0d9dd99..022d173 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c
@@ -1267,10 +1267,8 @@ { int i; - for (i = 0; i < n; ++i) { - free(options[i]); - options[i] = NULL; - } + for (i = 0; i < n; ++i) + zfree(&options[i]); } /* Check whether the browser is for 'top' or 'report' */
diff --git a/tools/perf/ui/gtk/util.c b/tools/perf/ui/gtk/util.c index 696c1fb..52e7fc4 100644 --- a/tools/perf/ui/gtk/util.c +++ b/tools/perf/ui/gtk/util.c
@@ -23,8 +23,7 @@ if (!perf_gtk__is_active_context(*ctx)) return -1; - free(*ctx); - *ctx = NULL; + zfree(ctx); return 0; }
diff --git a/tools/perf/util/alias.c b/tools/perf/util/alias.c index e6d1347..c0b43ee 100644 --- a/tools/perf/util/alias.c +++ b/tools/perf/util/alias.c
@@ -55,8 +55,7 @@ src++; c = cmdline[src]; if (!c) { - free(*argv); - *argv = NULL; + zfree(argv); return error("cmdline ends with \\"); } } @@ -68,8 +67,7 @@ cmdline[dst] = 0; if (quoted) { - free(*argv); - *argv = NULL; + zfree(argv); return error("unclosed quote"); }
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index 27ab7b5..a78721d 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c
@@ -185,8 +185,7 @@ return 0; out_free_ops: - free(ops->locked.ops); - ops->locked.ops = NULL; + zfree(&ops->locked.ops); return 0; } @@ -256,8 +255,7 @@ return 0; out_free_source: - free(ops->source.raw); - ops->source.raw = NULL; + zfree(&ops->source.raw); return -1; } @@ -560,8 +558,7 @@ return 0; out_free_name: - free(*namep); - *namep = NULL; + zfree(namep); return -1; } @@ -1113,8 +1110,7 @@ src_line = (void *)src_line + sizeof_src_line; } - free(notes->src->lines); - notes->src->lines = NULL; + zfree(¬es->src->lines); } /* Get the filename:line for the colored entries */
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index 4ddeecb..4045d08 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c
@@ -497,21 +497,18 @@ symbols__delete(&dso->symbols[i]); if (dso->short_name_allocated) { - free((char *)dso->short_name); - dso->short_name = NULL; + zfree((char **)&dso->short_name); dso->short_name_allocated = false; } if (dso->long_name_allocated) { - free((char *)dso->long_name); - dso->long_name = NULL; + zfree((char **)&dso->long_name); dso->long_name_allocated = false; } dso_cache__free(&dso->cache); dso__free_a2l(dso); - free(dso->symsrc_filename); - dso->symsrc_filename = NULL; + zfree(&dso->symsrc_filename); free(dso); }
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index da31829..b08a7ec 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c
@@ -101,10 +101,8 @@ void perf_evlist__exit(struct perf_evlist *evlist) { - free(evlist->mmap); - free(evlist->pollfd); - evlist->mmap = NULL; - evlist->pollfd = NULL; + zfree(&evlist->mmap); + zfree(&evlist->pollfd); } void perf_evlist__delete(struct perf_evlist *evlist) @@ -587,8 +585,7 @@ for (i = 0; i < evlist->nr_mmaps; i++) __perf_evlist__munmap(evlist, i); - free(evlist->mmap); - evlist->mmap = NULL; + zfree(&evlist->mmap); } static int perf_evlist__alloc_mmap(struct perf_evlist *evlist)
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 6874e04..93b6031 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c
@@ -750,8 +750,7 @@ { xyarray__delete(evsel->sample_id); evsel->sample_id = NULL; - free(evsel->id); - evsel->id = NULL; + zfree(&evsel->id); } void perf_evsel__close_fd(struct perf_evsel *evsel, int ncpus, int nthreads) @@ -1960,8 +1959,7 @@ evsel->attr.type = PERF_TYPE_SOFTWARE; evsel->attr.config = PERF_COUNT_SW_CPU_CLOCK; - free(evsel->name); - evsel->name = NULL; + zfree(&evsel->name); return true; }
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 10730b0..20f3a9c 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c
@@ -1324,8 +1324,7 @@ } } out: - if (buf) - free(buf); + free(buf); return events; error: if (events)
diff --git a/tools/perf/util/help.c b/tools/perf/util/help.c index 8b1f6e8..7b68978 100644 --- a/tools/perf/util/help.c +++ b/tools/perf/util/help.c
@@ -263,9 +263,8 @@ for (i = 0; i < old->cnt; i++) cmds->names[cmds->cnt++] = old->names[i]; - free(old->names); + zfree(&old->names); old->cnt = 0; - old->names = NULL; } const char *help_unknown_cmd(const char *cmd)
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index c78cc84..a98538d 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c
@@ -102,8 +102,7 @@ map_groups__exit(&machine->kmaps); dsos__delete(&machine->user_dsos); dsos__delete(&machine->kernel_dsos); - free(machine->root_dir); - machine->root_dir = NULL; + zfree(&machine->root_dir); } void machine__delete(struct machine *machine) @@ -562,11 +561,10 @@ * on one of them. */ if (type == MAP__FUNCTION) { - free((char *)kmap->ref_reloc_sym->name); - kmap->ref_reloc_sym->name = NULL; - free(kmap->ref_reloc_sym); - } - kmap->ref_reloc_sym = NULL; + zfree((char **)&kmap->ref_reloc_sym->name); + zfree(&kmap->ref_reloc_sym); + } else + kmap->ref_reloc_sym = NULL; } map__delete(machine->vmlinux_maps[type]);
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index 095a98e..4d3cd1a 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c
@@ -506,15 +506,13 @@ case EFAULT: raw_path = strchr(++raw_path, '/'); if (!raw_path) { - free(*new_path); - *new_path = NULL; + zfree(new_path); return -ENOENT; } continue; default: - free(*new_path); - *new_path = NULL; + zfree(new_path); return -errno; } }
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c index 8c08735..6d8796e 100644 --- a/tools/perf/util/probe-finder.c +++ b/tools/perf/util/probe-finder.c
@@ -226,10 +226,8 @@ if (!dbg) return NULL; - if (debuginfo__init_offline_dwarf(dbg, path) < 0) { - free(dbg); - dbg = NULL; - } + if (debuginfo__init_offline_dwarf(dbg, path) < 0) + zfree(&dbg); return dbg; } @@ -241,10 +239,8 @@ if (!dbg) return NULL; - if (debuginfo__init_online_kernel_dwarf(dbg, (Dwarf_Addr)addr) < 0) { - free(dbg); - dbg = NULL; - } + if (debuginfo__init_online_kernel_dwarf(dbg, (Dwarf_Addr)addr) < 0) + zfree(&dbg); return dbg; } @@ -1302,8 +1298,7 @@ ret = debuginfo__find_probes(dbg, &tf.pf); if (ret < 0) { - free(*tevs); - *tevs = NULL; + zfree(tevs); return ret; } @@ -1417,8 +1412,7 @@ free(af.vls[af.nvls].point.symbol); strlist__delete(af.vls[af.nvls].vars); } - free(af.vls); - *vls = NULL; + zfree(vls); return ret; } @@ -1522,8 +1516,7 @@ if (fname) { ppt->file = strdup(fname); if (ppt->file == NULL) { - free(ppt->function); - ppt->function = NULL; + zfree(&ppt->function); ret = -ENOMEM; goto end; } @@ -1577,8 +1570,7 @@ else ret = 0; /* Lines are not found */ else { - free(lf->lr->path); - lf->lr->path = NULL; + zfree(&lf->lr->path); } return ret; }
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index 923d000..fd9e1a4 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c
@@ -1621,13 +1621,10 @@ static void vmlinux_path__exit(void) { - while (--vmlinux_path__nr_entries >= 0) { - free(vmlinux_path[vmlinux_path__nr_entries]); - vmlinux_path[vmlinux_path__nr_entries] = NULL; - } + while (--vmlinux_path__nr_entries >= 0) + zfree(&vmlinux_path[vmlinux_path__nr_entries]); - free(vmlinux_path); - vmlinux_path = NULL; + zfree(&vmlinux_path); } static int vmlinux_path__init(void)
diff --git a/tools/perf/util/thread_map.c b/tools/perf/util/thread_map.c index 9b5f856..cf44644 100644 --- a/tools/perf/util/thread_map.c +++ b/tools/perf/util/thread_map.c
@@ -9,6 +9,7 @@ #include "strlist.h" #include <string.h> #include "thread_map.h" +#include "util.h" /* Skip "." and ".." directories */ static int filter(const struct dirent *dir) @@ -138,8 +139,7 @@ free(namelist); out_free_closedir: - free(threads); - threads = NULL; + zfree(&threads); goto out_closedir; } @@ -210,8 +210,7 @@ free(namelist); out_free_threads: - free(threads); - threads = NULL; + zfree(&threads); goto out; } @@ -262,8 +261,7 @@ return threads; out_free_threads: - free(threads); - threads = NULL; + zfree(&threads); goto out; }
diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c index c354b95..9f73bf4 100644 --- a/tools/perf/util/trace-event-info.c +++ b/tools/perf/util/trace-event-info.c
@@ -562,10 +562,8 @@ output_fd = fd; } - if (err) { - free(tdata); - tdata = NULL; - } + if (err) + zfree(&tdata); put_tracepoints_path(tps); return tdata;
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h index 9a2c268..6995d66 100644 --- a/tools/perf/util/util.h +++ b/tools/perf/util/util.h
@@ -186,6 +186,8 @@ return calloc(1, size); } +#define zfree(ptr) ({ free(*ptr); *ptr = NULL; }) + static inline int has_extension(const char *filename, const char *ext) { size_t len = strlen(filename);