It will be used in multiple threads in follow-up patches. Let it start to have refcounts.
Signed-off-by: Peter Xu <pet...@redhat.com> --- include/io/task.h | 3 +++ io/task.c | 23 ++++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/include/io/task.h b/include/io/task.h index 9dbe3758d7..c6acd6489c 100644 --- a/include/io/task.h +++ b/include/io/task.h @@ -322,4 +322,7 @@ gpointer qio_task_get_result_pointer(QIOTask *task); */ Object *qio_task_get_source(QIOTask *task); +void qio_task_ref(QIOTask *task); +void qio_task_unref(QIOTask *task); + #endif /* QIO_TASK_H */ diff --git a/io/task.c b/io/task.c index 204c0be286..00d3a5096a 100644 --- a/io/task.c +++ b/io/task.c @@ -32,6 +32,7 @@ struct QIOTask { Error *err; gpointer result; GDestroyNotify destroyResult; + uint32_t refcount; /* Threaded QIO task specific fields */ GSource *idle_source; /* The idle task to run complete routine */ @@ -57,6 +58,8 @@ QIOTask *qio_task_new(Object *source, trace_qio_task_new(task, source, func, opaque); + qio_task_ref(task); + return task; } @@ -165,7 +168,7 @@ void qio_task_complete(QIOTask *task) { task->func(task, task->opaque); trace_qio_task_complete(task); - qio_task_free(task); + qio_task_unref(task); } @@ -208,3 +211,21 @@ Object *qio_task_get_source(QIOTask *task) { return task->source; } + +void qio_task_ref(QIOTask *task) +{ + if (!task) { + return; + } + atomic_inc(&task->refcount); +} + +void qio_task_unref(QIOTask *task) +{ + if (!task) { + return; + } + if (atomic_fetch_dec(&task->refcount) == 1) { + qio_task_free(task); + } +} -- 2.14.3