[Spice-devel] [spice v10 10/27] server: Make the RedDrawable refcount thread-safe
Frediano Ziglio
fziglio at redhat.com
Wed Mar 2 11:41:43 UTC 2016
>
> Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
> ---
>
> In theory this could be needed by the next patch.
>
Are you saying that now compression is done in another thread?
> 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));
This code looks a bit odd. Usually there is a function to do it. 486
introduced xadd instruction and GCC have atomic built-ins.
Personally I would like to have a syntax that allows to use C11 instead of
some library specific ones.
> + 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);
Frediano
More information about the Spice-devel
mailing list