[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