[Spice-devel] [PATCH spice-server 2/3] record: Use reference counting for recording

Jonathon Jongsma jjongsma at redhat.com
Thu Mar 2 15:09:42 UTC 2017


Acked-by: Jonathon Jongsma <jjongsma at redhat.com>


On Thu, 2017-03-02 at 10:38 +0000, Frediano Ziglio wrote:
> Allows to share the recording object.
> 
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  server/red-record-qxl.c | 19 ++++++++++++++-----
>  server/red-record-qxl.h |  3 ++-
>  server/red-worker.c     |  2 +-
>  3 files changed, 17 insertions(+), 7 deletions(-)
> 
> diff --git a/server/red-record-qxl.c b/server/red-record-qxl.c
> index be6ac5a..e687c68 100644
> --- a/server/red-record-qxl.c
> +++ b/server/red-record-qxl.c
> @@ -32,6 +32,7 @@ struct RedRecord {
>      FILE *fd;
>      pthread_mutex_t lock;
>      unsigned int counter;
> +    gint refs;
>  };
>  
>  #if 0
> @@ -910,17 +911,25 @@ RedRecord *red_record_new(const char *filename)
>      }
>  
>      record = g_new(RedRecord, 1);
> +    record->refs = 1;
>      record->fd = f;
>      record->counter = 0;
>      pthread_mutex_init(&record->lock, NULL);
>      return record;
>  }
>  
> -void red_record_free(RedRecord *record)
> +RedRecord *red_record_ref(RedRecord *record)
>  {
> -    if (record) {
> -        fclose(record->fd);
> -        pthread_mutex_destroy(&record->lock);
> -        g_free(record);
> +    g_atomic_int_inc(&record->refs);
> +    return record;
> +}
> +
> +void red_record_unref(RedRecord *record)
> +{
> +    if (!record || !g_atomic_int_dec_and_test(&record->refs)) {
> +        return;
>      }
> +    fclose(record->fd);
> +    pthread_mutex_destroy(&record->lock);
> +    g_free(record);
>  }
> diff --git a/server/red-record-qxl.h b/server/red-record-qxl.h
> index 0685393..293e24a 100644
> --- a/server/red-record-qxl.h
> +++ b/server/red-record-qxl.h
> @@ -33,7 +33,8 @@ typedef struct RedRecord RedRecord;
>   */
>  RedRecord* red_record_new(const char *filename);
>  
> -void red_record_free(RedRecord *record);
> +RedRecord *red_record_ref(RedRecord *record);
> +void red_record_unref(RedRecord *record);
>  
>  void red_record_primary_surface_create(RedRecord *record,
>                                         QXLDevSurfaceCreate *surface,
> diff --git a/server/red-worker.c b/server/red-worker.c
> index 8735cd1..93cb615 100644
> --- a/server/red-worker.c
> +++ b/server/red-worker.c
> @@ -1461,7 +1461,7 @@ void red_worker_free(RedWorker *worker)
>      g_main_context_unref(worker->core.main_context);
>  
>      if (worker->record) {
> -        red_record_free(worker->record);
> +        red_record_unref(worker->record);
>      }
>      memslot_info_destroy(&worker->mem_slots);
>      free(worker);


More information about the Spice-devel mailing list