diff options
Diffstat (limited to 'io/task.c')
-rw-r--r-- | io/task.c | 62 |
1 files changed, 43 insertions, 19 deletions
@@ -29,6 +29,9 @@ struct QIOTask { QIOTaskFunc func; gpointer opaque; GDestroyNotify destroy; + Error *err; + gpointer result; + GDestroyNotify destroyResult; }; @@ -57,6 +60,12 @@ static void qio_task_free(QIOTask *task) if (task->destroy) { task->destroy(task->opaque); } + if (task->destroyResult) { + task->destroyResult(task->result); + } + if (task->err) { + error_free(task->err); + } object_unref(task->source); g_free(task); @@ -68,8 +77,6 @@ struct QIOTaskThreadData { QIOTaskWorker worker; gpointer opaque; GDestroyNotify destroy; - Error *err; - int ret; }; @@ -78,13 +85,8 @@ static gboolean gio_task_thread_result(gpointer opaque) struct QIOTaskThreadData *data = opaque; trace_qio_task_thread_result(data->task); - if (data->ret == 0) { - qio_task_complete(data->task); - } else { - qio_task_abort(data->task, data->err); - } + qio_task_complete(data->task); - error_free(data->err); if (data->destroy) { data->destroy(data->opaque); } @@ -100,10 +102,7 @@ static gpointer qio_task_thread_worker(gpointer opaque) struct QIOTaskThreadData *data = opaque; trace_qio_task_thread_run(data->task); - data->ret = data->worker(data->task, &data->err, data->opaque); - if (data->ret < 0 && data->err == NULL) { - error_setg(&data->err, "Task worker failed but did not set an error"); - } + data->worker(data->task, data->opaque); /* We're running in the background thread, and must only * ever report the task results in the main event loop @@ -140,22 +139,47 @@ void qio_task_run_in_thread(QIOTask *task, void qio_task_complete(QIOTask *task) { - task->func(task->source, NULL, task->opaque); + task->func(task, task->opaque); trace_qio_task_complete(task); qio_task_free(task); } -void qio_task_abort(QIOTask *task, - Error *err) + +void qio_task_set_error(QIOTask *task, + Error *err) { - task->func(task->source, err, task->opaque); - trace_qio_task_abort(task); - qio_task_free(task); + error_propagate(&task->err, err); +} + + +bool qio_task_propagate_error(QIOTask *task, + Error **errp) +{ + if (task->err) { + error_propagate(errp, task->err); + return true; + } + + return false; +} + + +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) { - object_ref(task->source); return task->source; } |