Message ID | 20170105160321.21786-5-berrange@redhat.com |
---|---|
State | New |
Headers | show |
On 01/05/2017 10:03 AM, Daniel P. Berrange wrote: > Currently there is no data associated with a successful > task completion. This adds an opaque pointer to the task > to store an arbitrary result. > > Signed-off-by: Daniel P. Berrange <berrange@redhat.com> > --- > include/io/task.h | 27 +++++++++++++++++++++++++++ > io/task.c | 20 ++++++++++++++++++++ > 2 files changed, 47 insertions(+) > I suppose a different approach would have been changing QIOTaskFunc() to have a void* return, but that would be more invasive. Grabbing the result separately from the task completing is a bit weird, but looks like it will work. Reviewed-by: Eric Blake <eblake@redhat.com>
On Thu, Jan 05, 2017 at 02:32:46PM -0600, Eric Blake wrote: > On 01/05/2017 10:03 AM, Daniel P. Berrange wrote: > > Currently there is no data associated with a successful > > task completion. This adds an opaque pointer to the task > > to store an arbitrary result. > > > > Signed-off-by: Daniel P. Berrange <berrange@redhat.com> > > --- > > include/io/task.h | 27 +++++++++++++++++++++++++++ > > io/task.c | 20 ++++++++++++++++++++ > > 2 files changed, 47 insertions(+) > > > > I suppose a different approach would have been changing QIOTaskFunc() to > have a void* return, but that would be more invasive. Grabbing the > result separately from the task completing is a bit weird, but looks > like it will work. FYI, the design I've chosen here closely matches that used by GLib in its own GTask / GAsyncResult, on which the QIOTask was modelled. The idea is that in future when we eventually bump to a newer glib, we can switch over to GTask easily. Regards, Daniel
diff --git a/include/io/task.h b/include/io/task.h index 1407747..ece1372 100644 --- a/include/io/task.h +++ b/include/io/task.h @@ -240,6 +240,33 @@ void qio_task_abort(QIOTask *task, /** + * qio_task_set_result_pointer: + * @task: the task struct + * @result: pointer to the result data + * + * Associate an opaque result with the task, + * which can later be retrieved with the + * qio_task_get_result_pointer() method + * + */ +void qio_task_set_result_pointer(QIOTask *task, + gpointer result, + GDestroyNotify notify); + + +/** + * qio_task_get_result_pointer: + * @task: the task struct + * + * Retrieve the opaque result data associated + * with the task, if any. + * + * Returns: the task result, or NULL + */ +gpointer qio_task_get_result_pointer(QIOTask *task); + + +/** * qio_task_get_source: * @task: the task struct * diff --git a/io/task.c b/io/task.c index a763990..675e196 100644 --- a/io/task.c +++ b/io/task.c @@ -29,6 +29,8 @@ struct QIOTask { QIOTaskFunc func; gpointer opaque; GDestroyNotify destroy; + gpointer result; + GDestroyNotify destroyResult; }; @@ -57,6 +59,9 @@ static void qio_task_free(QIOTask *task) if (task->destroy) { task->destroy(task->opaque); } + if (task->destroyResult) { + task->destroyResult(task->result); + } object_unref(task->source); g_free(task); @@ -154,6 +159,21 @@ void qio_task_abort(QIOTask *task, } +void qio_task_set_result_pointer(QIOTask *task, + gpointer result, + GDestroyNotify destroy) +{ + task->result = result; + task->destroyResult = destroy; +} + + +gpointer qio_task_get_result_pointer(QIOTask *task) +{ + return task->result; +} + + Object *qio_task_get_source(QIOTask *task) { return task->source;
Currently there is no data associated with a successful task completion. This adds an opaque pointer to the task to store an arbitrary result. Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- include/io/task.h | 27 +++++++++++++++++++++++++++ io/task.c | 20 ++++++++++++++++++++ 2 files changed, 47 insertions(+)