Patchwork [02/15] qom: using atomic ops to re-implement object_ref

login
register
mail settings
Submitter pingfan liu
Date Aug. 8, 2012, 6:25 a.m.
Message ID <1344407156-25562-3-git-send-email-qemulist@gmail.com>
Download mbox | patch
Permalink /patch/175859/
State New
Headers show

Comments

pingfan liu - Aug. 8, 2012, 6:25 a.m.
From: Liu Ping Fan <pingfank@linux.vnet.ibm.com>

Signed-off-by: Liu Ping Fan <pingfank@linux.vnet.ibm.com>
---
 include/qemu/object.h |    3 ++-
 qom/object.c          |   13 +++++--------
 2 files changed, 7 insertions(+), 9 deletions(-)

Patch

diff --git a/include/qemu/object.h b/include/qemu/object.h
index 8b17776..58db9d0 100644
--- a/include/qemu/object.h
+++ b/include/qemu/object.h
@@ -18,6 +18,7 @@ 
 #include <stdint.h>
 #include <stdbool.h>
 #include "qemu-queue.h"
+#include "qemu/atomic.h"
 
 struct Visitor;
 struct Error;
@@ -262,7 +263,7 @@  struct Object
     ObjectClass *class;
     GSList *interfaces;
     QTAILQ_HEAD(, ObjectProperty) properties;
-    uint32_t ref;
+    Atomic ref;
     Object *parent;
 };
 
diff --git a/qom/object.c b/qom/object.c
index 00bb3b0..822bdb7 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -378,7 +378,7 @@  void object_finalize(void *data)
     object_deinit(obj, ti);
     object_property_del_all(obj);
 
-    g_assert(obj->ref == 0);
+    g_assert(atomic_read(&obj->ref) == 0);
 }
 
 Object *object_new_with_type(Type type)
@@ -405,7 +405,7 @@  Object *object_new(const char *typename)
 void object_delete(Object *obj)
 {
     object_unref(obj);
-    g_assert(obj->ref == 0);
+    g_assert(atomic_read(&obj->ref) == 0);
     g_free(obj);
 }
 
@@ -639,16 +639,13 @@  GSList *object_class_get_list(const char *implements_type,
 
 void object_ref(Object *obj)
 {
-    obj->ref++;
+    atomic_inc(&obj->ref);
 }
 
 void object_unref(Object *obj)
 {
-    g_assert(obj->ref > 0);
-    obj->ref--;
-
-    /* parent always holds a reference to its children */
-    if (obj->ref == 0) {
+    g_assert(atomic_read(&obj->ref) > 0);
+    if (atomic_dec_and_test(&obj->ref)) {
         object_finalize(obj);
     }
 }