perf comm: Use atomic.h for refcounting
authorArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 19 May 2015 22:07:42 +0000 (19:07 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 27 May 2015 15:21:43 +0000 (12:21 -0300)
Now that we have atomic.h, we should convert all of the existing
refcounts to use it.

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-quzeuy3jwsyod6e06o39cl6y@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/comm.c

index b2bb59df65e10c10cfe6dd1aacb495d4804a6a4f..21b7ff382c3f0dfb2e0bff43074adae3c0b10973 100644 (file)
@@ -2,24 +2,27 @@
 #include "util.h"
 #include <stdlib.h>
 #include <stdio.h>
+#include <linux/atomic.h>
 
 struct comm_str {
        char *str;
        struct rb_node rb_node;
-       int ref;
+       atomic_t refcnt;
 };
 
 /* Should perhaps be moved to struct machine */
 static struct rb_root comm_str_root;
 
-static void comm_str__get(struct comm_str *cs)
+static struct comm_str *comm_str__get(struct comm_str *cs)
 {
-       cs->ref++;
+       if (cs)
+               atomic_inc(&cs->refcnt);
+       return cs;
 }
 
 static void comm_str__put(struct comm_str *cs)
 {
-       if (!--cs->ref) {
+       if (cs && atomic_dec_and_test(&cs->refcnt)) {
                rb_erase(&cs->rb_node, &comm_str_root);
                zfree(&cs->str);
                free(cs);
@@ -40,6 +43,8 @@ static struct comm_str *comm_str__alloc(const char *str)
                return NULL;
        }
 
+       atomic_set(&cs->refcnt, 0);
+
        return cs;
 }