[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