|
@@ -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;
|
|
|
}
|
|
|
|