record: Use reference counting for recording

Allows to share the recording object.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
This commit is contained in:
Frediano Ziglio 2017-03-01 22:36:26 +00:00
parent e0a5e4f0d0
commit ab6ace6b66
3 changed files with 18 additions and 8 deletions

View File

@ -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);
}

View File

@ -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,

View File

@ -1457,7 +1457,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);