diff options
Diffstat (limited to 'tools/perf/util/mem-info.c')
-rw-r--r-- | tools/perf/util/mem-info.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/tools/perf/util/mem-info.c b/tools/perf/util/mem-info.c index ff0dfdb5369a..27d67721a695 100644 --- a/tools/perf/util/mem-info.c +++ b/tools/perf/util/mem-info.c @@ -4,25 +4,32 @@ struct mem_info *mem_info__get(struct mem_info *mi) { - if (mi) - refcount_inc(&mi->refcnt); - return mi; + struct mem_info *result; + + if (RC_CHK_GET(result, mi)) + refcount_inc(mem_info__refcnt(mi)); + + return result; } void mem_info__put(struct mem_info *mi) { - if (mi && refcount_dec_and_test(&mi->refcnt)) { - addr_map_symbol__exit(&mi->iaddr); - addr_map_symbol__exit(&mi->daddr); - free(mi); + if (mi && refcount_dec_and_test(mem_info__refcnt(mi))) { + addr_map_symbol__exit(mem_info__iaddr(mi)); + addr_map_symbol__exit(mem_info__daddr(mi)); + RC_CHK_FREE(mi); + } else { + RC_CHK_PUT(mi); } } struct mem_info *mem_info__new(void) { - struct mem_info *mi = zalloc(sizeof(*mi)); + struct mem_info *result = NULL; + RC_STRUCT(mem_info) *mi = zalloc(sizeof(*mi)); + + if (ADD_RC_CHK(result, mi)) + refcount_set(mem_info__refcnt(result), 1); - if (mi) - refcount_set(&mi->refcnt, 1); - return mi; + return result; } |