[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 10/14] qio: refcount QIOTask
From: |
Peter Xu |
Subject: |
[Qemu-devel] [PATCH 10/14] qio: refcount QIOTask |
Date: |
Wed, 28 Feb 2018 13:06:29 +0800 |
It will be used in multiple threads in follow-up patches. Let it start
to have refcounts.
Signed-off-by: Peter Xu <address@hidden>
---
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
[Qemu-devel] [PATCH 11/14] qio/chardev: return QIOTask when connect async, Peter Xu, 2018/02/28
[Qemu-devel] [PATCH 12/14] qio: move QIOTaskThreadData into QIOTask, Peter Xu, 2018/02/28
[Qemu-devel] [PATCH 13/14] qio: allow threaded qiotask to switch contexts, Peter Xu, 2018/02/28