[Spice-devel] [spice v10 10/27] server: Make the RedDrawable refcount thread-safe

Francois Gouget fgouget at codeweavers.com
Tue Mar 1 15:53:10 UTC 2016


Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---

In theory this could be needed by the next patch.

 server/red-parse-qxl.h | 4 ++--
 server/red-worker.c    | 7 ++++++-
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/server/red-parse-qxl.h b/server/red-parse-qxl.h
index 9c30572..220a096 100644
--- a/server/red-parse-qxl.h
+++ b/server/red-parse-qxl.h
@@ -24,7 +24,7 @@
 #include "memslot.h"
 
 typedef struct RedDrawable {
-    int refs;
+    gint refs;
     QXLInstance *qxl;
     QXLReleaseInfoExt release_info_ext;
     uint32_t surface_id;
@@ -60,7 +60,7 @@ typedef struct RedDrawable {
 
 static inline RedDrawable *red_drawable_ref(RedDrawable *drawable)
 {
-    drawable->refs++;
+    g_atomic_int_inc(&drawable->refs);
     return drawable;
 }
 
diff --git a/server/red-worker.c b/server/red-worker.c
index fd8eefb..f45cc3b 100644
--- a/server/red-worker.c
+++ b/server/red-worker.c
@@ -124,9 +124,14 @@ static void common_release_recv_buf(RedChannelClient *rcc, uint16_t type, uint32
 
 void red_drawable_unref(RedDrawable *red_drawable)
 {
-    if (--red_drawable->refs) {
+    gint old_refs;
+    do {
+        old_refs = red_drawable->refs;
+    } while (!g_atomic_int_compare_and_exchange(&red_drawable->refs, old_refs, old_refs - 1));
+    if (old_refs > 1) {
         return;
     }
+
     red_drawable->qxl->st->qif->release_resource(red_drawable->qxl,
                                                  red_drawable->release_info_ext);
     red_put_drawable(red_drawable);
-- 
2.7.0



More information about the Spice-devel mailing list