[Spice-devel] [PATCH spice-gtk] spice-channel: Use atomic operations for SpiceMsgIn::refcount

Frediano Ziglio fziglio at redhat.com
Tue Apr 17 12:32:53 UTC 2018


This structure is potentially used in multiple thread.
Currently in Gstreamer thread using streaming data and coroutine
thread.

Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
I would avoid the atomic penalty but better safe then sorry
---
 src/spice-channel-priv.h | 2 +-
 src/spice-channel.c      | 5 ++---
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/src/spice-channel-priv.h b/src/spice-channel-priv.h
index b431037..706df9f 100644
--- a/src/spice-channel-priv.h
+++ b/src/spice-channel-priv.h
@@ -55,7 +55,7 @@ struct _SpiceMsgOut {
 };
 
 struct _SpiceMsgIn {
-    int                   refcount;
+    gint                  refcount;
     SpiceChannel          *channel;
     uint8_t               header[MAX_SPICE_DATA_HEADER_SIZE];
     uint8_t               *data;
diff --git a/src/spice-channel.c b/src/spice-channel.c
index 7e3e3b7..49897b7 100644
--- a/src/spice-channel.c
+++ b/src/spice-channel.c
@@ -531,7 +531,7 @@ void spice_msg_in_ref(SpiceMsgIn *in)
 {
     g_return_if_fail(in != NULL);
 
-    in->refcount++;
+    g_atomic_int_inc(&in->refcount);
 }
 
 G_GNUC_INTERNAL
@@ -539,8 +539,7 @@ void spice_msg_in_unref(SpiceMsgIn *in)
 {
     g_return_if_fail(in != NULL);
 
-    in->refcount--;
-    if (in->refcount > 0)
+    if (!g_atomic_int_dec_and_test(&in->refcount))
         return;
     if (in->parsed)
         in->pfree(in->parsed);
-- 
2.14.3



More information about the Spice-devel mailing list