[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