Drop usage of deprecated GSimpleAsyncResult API. --- v5: * Plug some GError leaks. * Drop StoragePoolBuildData in favour of GUINT_TO_POINTER/GPOINTER_TO_UINT. * Don't unref GTask before using it later in idle callback. libvirt-gobject/libvirt-gobject-domain.c | 290 +++++++++-------------- libvirt-gobject/libvirt-gobject-input-stream.c | 78 +++---- libvirt-gobject/libvirt-gobject-output-stream.c | 76 +++--- libvirt-gobject/libvirt-gobject-storage-pool.c | 296 +++++++++--------------- libvirt-gobject/libvirt-gobject-stream.c | 54 +++-- 5 files changed, 320 insertions(+), 474 deletions(-) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index 5509ce3..c768cd3 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -370,28 +370,20 @@ gboolean gvir_domain_start(GVirDomain *dom, return TRUE; } -typedef struct { - guint flags; -} DomainStartData; - -static void domain_start_data_free(DomainStartData *data) -{ - g_slice_free(DomainStartData, data); -} - static void -gvir_domain_start_helper(GSimpleAsyncResult *res, - GObject *object, +gvir_domain_start_helper(GTask *task, + gpointer source_object, + gpointer task_data, GCancellable *cancellable G_GNUC_UNUSED) { - GVirDomain *dom = GVIR_DOMAIN(object); - DomainStartData *data; + GVirDomain *dom = GVIR_DOMAIN(source_object); + guint flags = GPOINTER_TO_UINT(task_data); GError *err = NULL; - data = g_simple_async_result_get_op_res_gpointer(res); - - if (!gvir_domain_start(dom, data->flags, &err)) - g_simple_async_result_take_error(res, err); + if (!gvir_domain_start(dom, flags, &err)) + g_task_return_error(task, err); + else + g_task_return_boolean(task, TRUE); } /** @@ -410,25 +402,18 @@ void gvir_domain_start_async(GVirDomain *dom, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; - DomainStartData *data; + GTask *task; g_return_if_fail(GVIR_IS_DOMAIN(dom)); g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable)); - data = g_slice_new0(DomainStartData); - data->flags = flags; - - res = g_simple_async_result_new(G_OBJECT(dom), - callback, - user_data, - gvir_domain_start_async); - g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)domain_start_data_free); - g_simple_async_result_run_in_thread(res, - gvir_domain_start_helper, - G_PRIORITY_DEFAULT, - cancellable); - g_object_unref(res); + task = g_task_new(G_OBJECT(dom), + cancellable, + callback, + user_data); + g_task_set_task_data(task, GUINT_TO_POINTER(flags), NULL); + g_task_run_in_thread(task, gvir_domain_start_helper); + g_object_unref(task); } gboolean gvir_domain_start_finish(GVirDomain *dom, @@ -436,13 +421,10 @@ gboolean gvir_domain_start_finish(GVirDomain *dom, GError **err) { g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE); - g_return_val_if_fail(g_simple_async_result_is_valid(result, G_OBJECT(dom), gvir_domain_start_async), FALSE); + g_return_val_if_fail(g_task_is_valid(result, dom), FALSE); g_return_val_if_fail(err == NULL || *err == NULL, FALSE); - if (g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(result), err)) - return FALSE; - - return TRUE; + return g_task_propagate_boolean(G_TASK(result), err); } /** @@ -472,15 +454,18 @@ gboolean gvir_domain_resume(GVirDomain *dom, } static void -gvir_domain_resume_helper(GSimpleAsyncResult *res, - GObject *object, +gvir_domain_resume_helper(GTask *task, + gpointer source_object, + gpointer task_data G_GNUC_UNUSED, GCancellable *cancellable G_GNUC_UNUSED) { - GVirDomain *dom = GVIR_DOMAIN(object); + GVirDomain *dom = GVIR_DOMAIN(source_object); GError *err = NULL; if (!gvir_domain_resume(dom, &err)) - g_simple_async_result_take_error(res, err); + g_task_return_error(task, err); + else + g_task_return_boolean(task, TRUE); } /** @@ -497,20 +482,17 @@ void gvir_domain_resume_async(GVirDomain *dom, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; + GTask *task; g_return_if_fail(GVIR_IS_DOMAIN(dom)); g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable)); - res = g_simple_async_result_new(G_OBJECT(dom), - callback, - user_data, - gvir_domain_resume_async); - g_simple_async_result_run_in_thread(res, - gvir_domain_resume_helper, - G_PRIORITY_DEFAULT, - cancellable); - g_object_unref(res); + task = g_task_new(G_OBJECT(dom), + cancellable, + callback, + user_data); + g_task_run_in_thread(task, gvir_domain_resume_helper); + g_object_unref(task); } gboolean gvir_domain_resume_finish(GVirDomain *dom, @@ -518,13 +500,10 @@ gboolean gvir_domain_resume_finish(GVirDomain *dom, GError **err) { g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE); - g_return_val_if_fail(g_simple_async_result_is_valid(result, G_OBJECT(dom), gvir_domain_resume_async), FALSE); + g_return_val_if_fail(g_task_is_valid(result, dom), FALSE); g_return_val_if_fail(err == NULL || *err == NULL, FALSE); - if (g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(result), err)) - return FALSE; - - return TRUE; + return g_task_propagate_boolean(G_TASK(result), err); } /** @@ -556,15 +535,19 @@ gboolean gvir_domain_wakeup(GVirDomain *dom, } static void -gvir_domain_wakeup_helper(GSimpleAsyncResult *res, - GObject *object, +gvir_domain_wakeup_helper(GTask *task, + gpointer source_object, + gpointer task_data, GCancellable *cancellable G_GNUC_UNUSED) { - GVirDomain *dom = GVIR_DOMAIN(object); + GVirDomain *dom = GVIR_DOMAIN(source_object); + guint flags = GPOINTER_TO_UINT(task_data); GError *err = NULL; - if (!gvir_domain_wakeup(dom, (guint)g_simple_async_result_get_op_res_gssize(res), &err)) - g_simple_async_result_take_error(res, err); + if (!gvir_domain_wakeup(dom, flags, &err)) + g_task_return_error(task, err); + else + g_task_return_boolean(task, TRUE); } /** @@ -583,21 +566,18 @@ void gvir_domain_wakeup_async(GVirDomain *dom, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; + GTask *task; g_return_if_fail(GVIR_IS_DOMAIN(dom)); g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable)); - res = g_simple_async_result_new(G_OBJECT(dom), - callback, - user_data, - gvir_domain_wakeup_async); - g_simple_async_result_set_op_res_gssize (res, (gssize)flags); - g_simple_async_result_run_in_thread(res, - gvir_domain_wakeup_helper, - G_PRIORITY_DEFAULT, - cancellable); - g_object_unref(res); + task = g_task_new(G_OBJECT(dom), + cancellable, + callback, + user_data); + g_task_set_task_data(task, GUINT_TO_POINTER(flags), NULL); + g_task_run_in_thread(task, gvir_domain_wakeup_helper); + g_object_unref(task); } gboolean gvir_domain_wakeup_finish(GVirDomain *dom, @@ -605,13 +585,10 @@ gboolean gvir_domain_wakeup_finish(GVirDomain *dom, GError **err) { g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE); - g_return_val_if_fail(g_simple_async_result_is_valid(result, G_OBJECT(dom), gvir_domain_wakeup_async), FALSE); + g_return_val_if_fail(g_task_is_valid(result, dom), FALSE); g_return_val_if_fail(err == NULL || *err == NULL, FALSE); - if (g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(result), err)) - return FALSE; - - return TRUE; + return g_task_propagate_boolean(G_TASK(result), err); } /** @@ -785,18 +762,19 @@ static void domain_save_to_file_data_free(DomainSaveToFileData *data) } static void -gvir_domain_save_to_file_helper(GSimpleAsyncResult *res, - GObject *object, +gvir_domain_save_to_file_helper(GTask *task, + gpointer source_object, + gpointer task_data, GCancellable *cancellable G_GNUC_UNUSED) { - GVirDomain *dom = GVIR_DOMAIN(object); - DomainSaveToFileData *data; + GVirDomain *dom = GVIR_DOMAIN(source_object); + DomainSaveToFileData *data = (DomainSaveToFileData *) task_data; GError *err = NULL; - data = g_simple_async_result_get_op_res_gpointer(res); - if (!gvir_domain_save_to_file(dom, data->filename, data->custom_conf, data->flags, &err)) - g_simple_async_result_take_error(res, err); + g_task_return_error(task, err); + else + g_task_return_boolean(task, TRUE); } /** @@ -819,7 +797,7 @@ void gvir_domain_save_to_file_async(GVirDomain *dom, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; + GTask *task; DomainSaveToFileData *data; g_return_if_fail(GVIR_IS_DOMAIN(dom)); @@ -832,19 +810,15 @@ void gvir_domain_save_to_file_async(GVirDomain *dom, data->custom_conf = g_object_ref(custom_conf); data->flags = flags; - res = g_simple_async_result_new(G_OBJECT(dom), - callback, - user_data, - gvir_domain_save_to_file_async); - g_simple_async_result_set_op_res_gpointer(res, data, (GDestroyNotify) - domain_save_to_file_data_free); - - g_simple_async_result_run_in_thread(res, - gvir_domain_save_to_file_helper, - G_PRIORITY_DEFAULT, - cancellable); - - g_object_unref(res); + task = g_task_new(G_OBJECT(dom), + cancellable, + callback, + user_data); + g_task_set_task_data(task, + data, + (GDestroyNotify) domain_save_to_file_data_free); + g_task_run_in_thread(task, gvir_domain_save_to_file_helper); + g_object_unref(task); } /** @@ -862,16 +836,10 @@ gboolean gvir_domain_save_to_file_finish(GVirDomain *dom, GError **err) { g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE); - g_return_val_if_fail(g_simple_async_result_is_valid - (result, - G_OBJECT(dom), - gvir_domain_save_to_file_async), FALSE); + g_return_val_if_fail(g_task_is_valid(result, dom), FALSE); g_return_val_if_fail(err == NULL || *err == NULL, FALSE); - if (g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(result), err)) - return FALSE; - - return TRUE; + return g_task_propagate_boolean(G_TASK(result), err); } /** @@ -1012,22 +980,22 @@ GVirDomainInfo *gvir_domain_get_info(GVirDomain *dom, } static void -gvir_domain_get_info_helper(GSimpleAsyncResult *res, - GObject *object, +gvir_domain_get_info_helper(GTask *task, + gpointer source_object, + gpointer task_data G_GNUC_UNUSED, GCancellable *cancellable G_GNUC_UNUSED) { - GVirDomain *dom = GVIR_DOMAIN(object); + GVirDomain *dom = GVIR_DOMAIN(source_object); GVirDomainInfo *info; GError *err = NULL; info = gvir_domain_get_info(dom, &err); if (err) - g_simple_async_result_take_error(res, err); + g_task_return_error(task, err); else - g_simple_async_result_set_op_res_gpointer - (res, - info, - (GDestroyNotify) gvir_domain_info_free); + g_task_return_pointer(task, + info, + (GDestroyNotify) gvir_domain_info_free); } /** @@ -1044,20 +1012,17 @@ void gvir_domain_get_info_async(GVirDomain *dom, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; + GTask *task; g_return_if_fail(GVIR_IS_DOMAIN(dom)); g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable)); - res = g_simple_async_result_new(G_OBJECT(dom), - callback, - user_data, - gvir_domain_get_info_async); - g_simple_async_result_run_in_thread(res, - gvir_domain_get_info_helper, - G_PRIORITY_DEFAULT, - cancellable); - g_object_unref(res); + task = g_task_new(G_OBJECT(dom), + cancellable, + callback, + user_data); + g_task_run_in_thread(task, gvir_domain_get_info_helper); + g_object_unref(task); } /** @@ -1075,22 +1040,11 @@ GVirDomainInfo *gvir_domain_get_info_finish(GVirDomain *dom, GAsyncResult *result, GError **err) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT(result); - GVirDomainInfo *ret; - g_return_val_if_fail(GVIR_IS_DOMAIN(dom), NULL); - g_return_val_if_fail - (g_simple_async_result_is_valid(result, - G_OBJECT(dom), - gvir_domain_get_info_async), - NULL); - - if (g_simple_async_result_propagate_error(res, err)) - return NULL; - - ret = g_simple_async_result_get_op_res_gpointer(res); + g_return_val_if_fail(g_task_is_valid(result, dom), NULL); + g_return_val_if_fail(err == NULL || *err == NULL, NULL); - return gvir_domain_info_copy (ret); + return g_task_propagate_pointer(G_TASK(result), err); } /** @@ -1365,28 +1319,20 @@ gboolean gvir_domain_save (GVirDomain *dom, return TRUE; } -typedef struct { - guint flags; -} DomainSaveData; - -static void domain_save_data_free(DomainSaveData *data) -{ - g_slice_free (DomainSaveData, data); -} - static void -gvir_domain_save_helper(GSimpleAsyncResult *res, - GObject *object, +gvir_domain_save_helper(GTask *task, + gpointer source_object, + gpointer task_data, GCancellable *cancellable G_GNUC_UNUSED) { - GVirDomain *dom = GVIR_DOMAIN(object); - DomainSaveData *data; + GVirDomain *dom = GVIR_DOMAIN(source_object); + guint flags = GPOINTER_TO_UINT(task_data); GError *err = NULL; - data = g_simple_async_result_get_op_res_gpointer (res); - - if (!gvir_domain_save(dom, data->flags, &err)) - g_simple_async_result_take_error(res, err); + if (!gvir_domain_save(dom, flags, &err)) + g_task_return_error(task, err); + else + g_task_return_boolean(task, TRUE); } /** @@ -1405,25 +1351,18 @@ void gvir_domain_save_async (GVirDomain *dom, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; - DomainSaveData *data; + GTask *task; g_return_if_fail(GVIR_IS_DOMAIN(dom)); g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable)); - data = g_slice_new0(DomainSaveData); - data->flags = flags; - - res = g_simple_async_result_new(G_OBJECT(dom), - callback, - user_data, - gvir_domain_save_async); - g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify) domain_save_data_free); - g_simple_async_result_run_in_thread(res, - gvir_domain_save_helper, - G_PRIORITY_DEFAULT, - cancellable); - g_object_unref(res); + task = g_task_new(G_OBJECT(dom), + cancellable, + callback, + user_data); + g_task_set_task_data(task, GUINT_TO_POINTER(flags), NULL); + g_task_run_in_thread(task, gvir_domain_save_helper); + g_object_unref(task); } /** @@ -1441,15 +1380,10 @@ gboolean gvir_domain_save_finish (GVirDomain *dom, GError **err) { g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE); - g_return_val_if_fail(g_simple_async_result_is_valid(result, G_OBJECT(dom), - gvir_domain_save_async), - FALSE); + g_return_val_if_fail(g_task_is_valid(result, dom), FALSE); g_return_val_if_fail(err == NULL || *err == NULL, FALSE); - if (g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(result), err)) - return FALSE; - - return TRUE; + return g_task_propagate_boolean(G_TASK(result), err); } /** @@ -1682,6 +1616,7 @@ GVirDomainSnapshot *gvir_domain_create_snapshot_finish(GVirDomain *domain, GError **error) { g_return_val_if_fail(g_task_is_valid(result, domain), NULL); + g_return_val_if_fail(error == NULL || *error == NULL, NULL); return g_task_propagate_pointer(G_TASK(result), error); } @@ -1847,6 +1782,7 @@ gboolean gvir_domain_fetch_snapshots_finish(GVirDomain *dom, { g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE); g_return_val_if_fail(g_task_is_valid(res, dom), FALSE); + g_return_val_if_fail(error == NULL || *error == NULL, FALSE); return g_task_propagate_boolean(G_TASK(res), error); } diff --git a/libvirt-gobject/libvirt-gobject-input-stream.c b/libvirt-gobject/libvirt-gobject-input-stream.c index ff1a70c..8ef60d6 100644 --- a/libvirt-gobject/libvirt-gobject-input-stream.c +++ b/libvirt-gobject/libvirt-gobject-input-stream.c @@ -45,8 +45,7 @@ struct _GVirInputStreamPrivate GVirStream *stream; /* pending operation metadata */ - GSimpleAsyncResult *result; - GCancellable *cancellable; + GTask *task; gpointer buffer; gsize count; }; @@ -103,48 +102,45 @@ gvir_input_stream_read_ready(GVirStream *stream, { GVirInputStream *input_stream = GVIR_INPUT_STREAM(opaque); GVirInputStreamPrivate *priv = input_stream->priv; - GSimpleAsyncResult *simple = priv->result; + GTask *task = priv->task; + GCancellable *cancellable = g_task_get_cancellable(task); GError *error = NULL; gssize result; + priv->task = NULL; + if (!(cond & GVIR_STREAM_IO_CONDITION_READABLE)) { g_warn_if_reached(); - g_simple_async_result_set_error(simple, - G_IO_ERROR, - G_IO_ERROR_INVALID_ARGUMENT, - "%s", - "Expected stream to be readable"); + g_task_return_new_error(task, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + "%s", + "Expected stream to be readable"); goto cleanup; } - result = gvir_stream_receive(stream, priv->buffer, priv->count, - priv->cancellable, &error); + result = gvir_stream_receive(stream, priv->buffer, priv->count, + cancellable, &error); + if (error != NULL) { + if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) { + g_warn_if_reached(); + g_task_return_new_error(task, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + "%s", + "Expected stream to be readable"); + } else { + g_task_return_error(task, error); + } + g_error_free (error); - if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) { - g_warn_if_reached(); - g_simple_async_result_set_error(simple, - G_IO_ERROR, - G_IO_ERROR_INVALID_ARGUMENT, - "%s", - "Expected stream to be readable"); goto cleanup; } - if (result >= 0) - g_simple_async_result_set_op_res_gssize(simple, result); - - if (error) - g_simple_async_result_take_error(simple, error); - - if (priv->cancellable) { - g_object_unref(priv->cancellable); - priv->cancellable = NULL; - } + g_task_return_int(task, result); cleanup: - priv->result = NULL; - g_simple_async_result_complete(simple); - g_object_unref(simple); + g_object_unref(task); return FALSE; } @@ -159,7 +155,7 @@ static void gvir_input_stream_read_async(GInputStream *stream, GVirInputStream *input_stream = GVIR_INPUT_STREAM(stream); g_return_if_fail(GVIR_IS_INPUT_STREAM(stream)); - g_return_if_fail(input_stream->priv->result == NULL); + g_return_if_fail(input_stream->priv->task == NULL); gvir_stream_add_watch_full(input_stream->priv->stream, G_PRIORITY_DEFAULT, @@ -168,12 +164,8 @@ static void gvir_input_stream_read_async(GInputStream *stream, g_object_ref(stream), (GDestroyNotify)g_object_unref); - input_stream->priv->result = - g_simple_async_result_new(G_OBJECT(stream), callback, user_data, - gvir_input_stream_read_async); - if (cancellable) - g_object_ref(cancellable); - input_stream->priv->cancellable = cancellable; + input_stream->priv->task = + g_task_new(stream, cancellable, callback, user_data); input_stream->priv->buffer = buffer; input_stream->priv->count = count; } @@ -181,22 +173,18 @@ static void gvir_input_stream_read_async(GInputStream *stream, static gssize gvir_input_stream_read_finish(GInputStream *stream, GAsyncResult *result, - GError **error G_GNUC_UNUSED) + GError **error) { GVirInputStream *input_stream = GVIR_INPUT_STREAM(stream); - GSimpleAsyncResult *simple; virStreamPtr handle; gssize count; g_return_val_if_fail(GVIR_IS_INPUT_STREAM(stream), -1); - g_return_val_if_fail(g_simple_async_result_is_valid(result, G_OBJECT(stream), - gvir_input_stream_read_async), - -1); + g_return_val_if_fail(g_task_is_valid(result, stream), -1); + g_return_val_if_fail(error == NULL || *error == NULL, -1); g_object_get(input_stream->priv->stream, "handle", &handle, NULL); - simple = G_SIMPLE_ASYNC_RESULT(result); - - count = g_simple_async_result_get_op_res_gssize(simple); + count = g_task_propagate_int(G_TASK(result), error); virStreamFree(handle); diff --git a/libvirt-gobject/libvirt-gobject-output-stream.c b/libvirt-gobject/libvirt-gobject-output-stream.c index f39328b..6968c3d 100644 --- a/libvirt-gobject/libvirt-gobject-output-stream.c +++ b/libvirt-gobject/libvirt-gobject-output-stream.c @@ -45,8 +45,7 @@ struct _GVirOutputStreamPrivate GVirStream *stream; /* pending operation metadata */ - GSimpleAsyncResult *result; - GCancellable *cancellable; + GTask *task; const void * buffer; gsize count; }; @@ -103,48 +102,45 @@ gvir_output_stream_write_ready(GVirStream *stream, { GVirOutputStream *output_stream = GVIR_OUTPUT_STREAM(opaque); GVirOutputStreamPrivate *priv = output_stream->priv; - GSimpleAsyncResult *simple = priv->result; + GTask *task = priv->task; + GCancellable *cancellable = g_task_get_cancellable(task); GError *error = NULL; gssize result; if (!(cond & GVIR_STREAM_IO_CONDITION_WRITABLE)) { g_warn_if_reached(); - g_simple_async_result_set_error(simple, - G_IO_ERROR, - G_IO_ERROR_INVALID_ARGUMENT, - "%s", - "Expected stream to be writable"); + g_task_return_new_error(task, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + "%s", + "Expected stream to be readable"); goto cleanup; } result = gvir_stream_send(stream, priv->buffer, priv->count, - priv->cancellable, &error); + cancellable, &error); + + if (error != NULL) { + if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) { + g_warn_if_reached(); + g_task_return_new_error(task, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + "%s", + "Expected stream to be writable"); + } else { + g_task_return_error(task, error); + } + g_error_free (error); - if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) { - g_warn_if_reached(); - g_simple_async_result_set_error(simple, - G_IO_ERROR, - G_IO_ERROR_INVALID_ARGUMENT, - "%s", - "Expected stream to be writable"); goto cleanup; } - if (result >= 0) - g_simple_async_result_set_op_res_gssize(simple, result); - - if (error) - g_simple_async_result_take_error(simple, error); - - if (priv->cancellable) { - g_object_unref(priv->cancellable); - priv->cancellable = NULL; - } + g_task_return_int(task, result); cleanup: - priv->result = NULL; - g_simple_async_result_complete(simple); - g_object_unref(simple); + priv->task = NULL; + g_object_unref(task); return FALSE; } @@ -159,7 +155,7 @@ static void gvir_output_stream_write_async(GOutputStream *stream, GVirOutputStream *output_stream = GVIR_OUTPUT_STREAM(stream); g_return_if_fail(GVIR_IS_OUTPUT_STREAM(stream)); - g_return_if_fail(output_stream->priv->result == NULL); + g_return_if_fail(output_stream->priv->task == NULL); gvir_stream_add_watch_full(output_stream->priv->stream, G_PRIORITY_DEFAULT, @@ -168,12 +164,8 @@ static void gvir_output_stream_write_async(GOutputStream *stream, g_object_ref(stream), (GDestroyNotify)g_object_unref); - output_stream->priv->result = - g_simple_async_result_new(G_OBJECT(stream), callback, user_data, - gvir_output_stream_write_async); - if (cancellable) - g_object_ref(cancellable); - output_stream->priv->cancellable = cancellable; + output_stream->priv->task = + g_task_new(stream, cancellable, callback, user_data); output_stream->priv->buffer = buffer; output_stream->priv->count = count; } @@ -181,22 +173,18 @@ static void gvir_output_stream_write_async(GOutputStream *stream, static gssize gvir_output_stream_write_finish(GOutputStream *stream, GAsyncResult *result, - GError **error G_GNUC_UNUSED) + GError **error) { GVirOutputStream *output_stream = GVIR_OUTPUT_STREAM(stream); - GSimpleAsyncResult *simple; virStreamPtr handle; gssize count; g_return_val_if_fail(GVIR_IS_OUTPUT_STREAM(stream), -1); - g_return_val_if_fail(g_simple_async_result_is_valid(result, G_OBJECT(stream), - gvir_output_stream_write_async), - -1); + g_return_val_if_fail(g_task_is_valid(result, stream), -1); + g_return_val_if_fail(error == NULL || *error == NULL, -1); g_object_get(output_stream->priv->stream, "handle", &handle, NULL); - simple = G_SIMPLE_ASYNC_RESULT(result); - - count = g_simple_async_result_get_op_res_gssize(simple); + count = g_task_propagate_int(G_TASK(result), error); virStreamFree(handle); diff --git a/libvirt-gobject/libvirt-gobject-storage-pool.c b/libvirt-gobject/libvirt-gobject-storage-pool.c index a0dcebc..5f97691 100644 --- a/libvirt-gobject/libvirt-gobject-storage-pool.c +++ b/libvirt-gobject/libvirt-gobject-storage-pool.c @@ -439,17 +439,18 @@ cleanup: } static void -gvir_storage_pool_refresh_helper(GSimpleAsyncResult *res, - GObject *object, +gvir_storage_pool_refresh_helper(GTask *task, + gpointer source_object, + gpointer task_data G_GNUC_UNUSED, GCancellable *cancellable) { - GVirStoragePool *pool = GVIR_STORAGE_POOL(object); + GVirStoragePool *pool = GVIR_STORAGE_POOL(source_object); GError *err = NULL; - if (!gvir_storage_pool_refresh(pool, cancellable, &err)) { - g_simple_async_result_set_from_error(res, err); - g_error_free(err); - } + if (!gvir_storage_pool_refresh(pool, cancellable, &err)) + g_task_return_error(task, err); + else + g_task_return_boolean(task, TRUE); } /** @@ -464,20 +465,17 @@ void gvir_storage_pool_refresh_async(GVirStoragePool *pool, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; + GTask *task; g_return_if_fail(GVIR_IS_STORAGE_POOL(pool)); g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable)); - res = g_simple_async_result_new(G_OBJECT(pool), - callback, - user_data, - gvir_storage_pool_refresh_async); - g_simple_async_result_run_in_thread(res, - gvir_storage_pool_refresh_helper, - G_PRIORITY_DEFAULT, - cancellable); - g_object_unref(res); + task = g_task_new(G_OBJECT(pool), + cancellable, + callback, + user_data); + g_task_run_in_thread(task, gvir_storage_pool_refresh_helper); + g_object_unref(task); } /** @@ -490,15 +488,10 @@ gboolean gvir_storage_pool_refresh_finish(GVirStoragePool *pool, GError **err) { g_return_val_if_fail(GVIR_IS_STORAGE_POOL(pool), FALSE); - g_return_val_if_fail(g_simple_async_result_is_valid(result, G_OBJECT(pool), - gvir_storage_pool_refresh_async), - FALSE); - - if (g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(result), - err)) - return FALSE; + g_return_val_if_fail(g_task_is_valid(result, pool), FALSE); + g_return_val_if_fail(err == NULL || *err == NULL, FALSE); - return TRUE; + return g_task_propagate_boolean(G_TASK(result), err); } static void gvir_storage_vol_ref(gpointer obj, gpointer ignore G_GNUC_UNUSED) @@ -654,28 +647,20 @@ gboolean gvir_storage_pool_build (GVirStoragePool *pool, return TRUE; } -typedef struct { - guint flags; -} StoragePoolBuildData; - static void -gvir_storage_pool_build_helper(GSimpleAsyncResult *res, - GObject *object, +gvir_storage_pool_build_helper(GTask *task, + gpointer source_object, + gpointer task_data, GCancellable *cancellable G_GNUC_UNUSED) { - GVirStoragePool *pool = GVIR_STORAGE_POOL(object); - StoragePoolBuildData *data; + GVirStoragePool *pool = GVIR_STORAGE_POOL(source_object); + guint flags = GPOINTER_TO_UINT(task_data); GError *err = NULL; - data = (StoragePoolBuildData *) g_object_get_data(G_OBJECT(res), - "StoragePoolBuildData"); - - if (!gvir_storage_pool_build(pool, data->flags, &err)) { - g_simple_async_result_set_from_error(res, err); - g_error_free(err); - } - - g_slice_free (StoragePoolBuildData, data); + if (!gvir_storage_pool_build(pool, flags, &err)) + g_task_return_error(task, err); + else + g_task_return_boolean(task, TRUE); } /** @@ -692,25 +677,18 @@ void gvir_storage_pool_build_async (GVirStoragePool *pool, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; - StoragePoolBuildData *data; + GTask *task; g_return_if_fail(GVIR_IS_STORAGE_POOL(pool)); g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable)); - data = g_slice_new0(StoragePoolBuildData); - data->flags = flags; - - res = g_simple_async_result_new(G_OBJECT(pool), - callback, - user_data, - gvir_storage_pool_build_async); - g_object_set_data(G_OBJECT(res), "StoragePoolBuildData", data); - g_simple_async_result_run_in_thread(res, - gvir_storage_pool_build_helper, - G_PRIORITY_DEFAULT, - cancellable); - g_object_unref(res); + task = g_task_new(G_OBJECT(pool), + cancellable, + callback, + user_data); + g_task_set_task_data(task, GUINT_TO_POINTER(flags), NULL); + g_task_run_in_thread(task, gvir_storage_pool_build_helper); + g_object_unref(task); } /** @@ -726,16 +704,10 @@ gboolean gvir_storage_pool_build_finish(GVirStoragePool *pool, GError **err) { g_return_val_if_fail(GVIR_IS_STORAGE_POOL(pool), FALSE); - g_return_val_if_fail(g_simple_async_result_is_valid(result, G_OBJECT(pool), - gvir_storage_pool_build_async), - FALSE); + g_return_val_if_fail(g_task_is_valid(result, pool), FALSE); g_return_val_if_fail(err == NULL || *err == NULL, FALSE); - if (g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(result), - err)) - return FALSE; - - return TRUE; + return g_task_propagate_boolean(G_TASK(result), err); } /** @@ -762,17 +734,18 @@ gboolean gvir_storage_pool_undefine (GVirStoragePool *pool, } static void -gvir_storage_pool_undefine_helper(GSimpleAsyncResult *res, - GObject *object, +gvir_storage_pool_undefine_helper(GTask *task, + gpointer source_object, + gpointer task_data G_GNUC_UNUSED, GCancellable *cancellable G_GNUC_UNUSED) { - GVirStoragePool *pool = GVIR_STORAGE_POOL(object); + GVirStoragePool *pool = GVIR_STORAGE_POOL(source_object); GError *err = NULL; - if (!gvir_storage_pool_undefine(pool, &err)) { - g_simple_async_result_set_from_error(res, err); - g_error_free(err); - } + if (!gvir_storage_pool_undefine(pool, &err)) + g_task_return_error(task, err); + else + g_task_return_boolean(task, TRUE); } /** @@ -787,20 +760,17 @@ void gvir_storage_pool_undefine_async (GVirStoragePool *pool, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; + GTask *task; g_return_if_fail(GVIR_IS_STORAGE_POOL(pool)); g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable)); - res = g_simple_async_result_new(G_OBJECT(pool), - callback, - user_data, - gvir_storage_pool_undefine_async); - g_simple_async_result_run_in_thread(res, - gvir_storage_pool_undefine_helper, - G_PRIORITY_DEFAULT, - cancellable); - g_object_unref(res); + task = g_task_new(G_OBJECT(pool), + cancellable, + callback, + user_data); + g_task_run_in_thread(task, gvir_storage_pool_undefine_helper); + g_object_unref(task); } /** @@ -816,16 +786,10 @@ gboolean gvir_storage_pool_undefine_finish(GVirStoragePool *pool, GError **err) { g_return_val_if_fail(GVIR_IS_STORAGE_POOL(pool), FALSE); - g_return_val_if_fail(g_simple_async_result_is_valid(result, G_OBJECT(pool), - gvir_storage_pool_undefine_async), - FALSE); + g_return_val_if_fail(g_task_is_valid(result, pool), FALSE); g_return_val_if_fail(err == NULL || *err == NULL, FALSE); - if (g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(result), - err)) - return FALSE; - - return TRUE; + return g_task_propagate_boolean(G_TASK(result), err); } /** @@ -854,23 +818,19 @@ gboolean gvir_storage_pool_start (GVirStoragePool *pool, } static void -gvir_storage_pool_start_helper(GSimpleAsyncResult *res, - GObject *object, +gvir_storage_pool_start_helper(GTask *task, + gpointer source_object, + gpointer task_data, GCancellable *cancellable G_GNUC_UNUSED) { - GVirStoragePool *pool = GVIR_STORAGE_POOL(object); - StoragePoolBuildData *data; + GVirStoragePool *pool = GVIR_STORAGE_POOL(source_object); + guint flags = GPOINTER_TO_UINT(task_data); GError *err = NULL; - data = (StoragePoolBuildData *) g_object_get_data(G_OBJECT(res), - "StoragePoolBuildData"); - - if (!gvir_storage_pool_start(pool, data->flags, &err)) { - g_simple_async_result_set_from_error(res, err); - g_error_free(err); - } - - g_slice_free (StoragePoolBuildData, data); + if (!gvir_storage_pool_start(pool, flags, &err)) + g_task_return_error(task, err); + else + g_task_return_boolean(task, TRUE); } /** @@ -887,25 +847,18 @@ void gvir_storage_pool_start_async (GVirStoragePool *pool, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; - StoragePoolBuildData *data; + GTask *task; g_return_if_fail(GVIR_IS_STORAGE_POOL(pool)); g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable)); - data = g_slice_new0(StoragePoolBuildData); - data->flags = flags; - - res = g_simple_async_result_new(G_OBJECT(pool), - callback, - user_data, - gvir_storage_pool_start_async); - g_object_set_data(G_OBJECT(res), "StoragePoolBuildData", data); - g_simple_async_result_run_in_thread(res, - gvir_storage_pool_start_helper, - G_PRIORITY_DEFAULT, - cancellable); - g_object_unref(res); + task = g_task_new(G_OBJECT(pool), + cancellable, + callback, + user_data); + g_task_set_task_data(task, GUINT_TO_POINTER(flags), NULL); + g_task_run_in_thread(task, gvir_storage_pool_start_helper); + g_object_unref(task); } /** @@ -921,16 +874,10 @@ gboolean gvir_storage_pool_start_finish(GVirStoragePool *pool, GError **err) { g_return_val_if_fail(GVIR_IS_STORAGE_POOL(pool), FALSE); - g_return_val_if_fail(g_simple_async_result_is_valid(result, G_OBJECT(pool), - gvir_storage_pool_start_async), - FALSE); + g_return_val_if_fail(g_task_is_valid(result, pool), FALSE); g_return_val_if_fail(err == NULL || *err == NULL, FALSE); - if (g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(result), - err)) - return FALSE; - - return TRUE; + return g_task_propagate_boolean(G_TASK(result), err); } /** @@ -957,17 +904,18 @@ gboolean gvir_storage_pool_stop (GVirStoragePool *pool, } static void -gvir_storage_pool_stop_helper(GSimpleAsyncResult *res, - GObject *object, +gvir_storage_pool_stop_helper(GTask *task, + gpointer source_object, + gpointer task_data G_GNUC_UNUSED, GCancellable *cancellable G_GNUC_UNUSED) { - GVirStoragePool *pool = GVIR_STORAGE_POOL(object); + GVirStoragePool *pool = GVIR_STORAGE_POOL(source_object); GError *err = NULL; - if (!gvir_storage_pool_stop(pool, &err)) { - g_simple_async_result_set_from_error(res, err); - g_error_free(err); - } + if (!gvir_storage_pool_stop(pool, &err)) + g_task_return_error(task, err); + else + g_task_return_boolean(task, TRUE); } /** @@ -982,20 +930,17 @@ void gvir_storage_pool_stop_async (GVirStoragePool *pool, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; + GTask *task; g_return_if_fail(GVIR_IS_STORAGE_POOL(pool)); g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable)); - res = g_simple_async_result_new(G_OBJECT(pool), - callback, - user_data, - gvir_storage_pool_stop_async); - g_simple_async_result_run_in_thread(res, - gvir_storage_pool_stop_helper, - G_PRIORITY_DEFAULT, - cancellable); - g_object_unref(res); + task = g_task_new(G_OBJECT(pool), + cancellable, + callback, + user_data); + g_task_run_in_thread(task, gvir_storage_pool_stop_helper); + g_object_unref(task); } /** @@ -1011,16 +956,10 @@ gboolean gvir_storage_pool_stop_finish(GVirStoragePool *pool, GError **err) { g_return_val_if_fail(GVIR_IS_STORAGE_POOL(pool), FALSE); - g_return_val_if_fail(g_simple_async_result_is_valid(result, G_OBJECT(pool), - gvir_storage_pool_stop_async), - FALSE); + g_return_val_if_fail(g_task_is_valid(result, pool), FALSE); g_return_val_if_fail(err == NULL || *err == NULL, FALSE); - if (g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(result), - err)) - return FALSE; - - return TRUE; + return g_task_propagate_boolean(G_TASK(result), err); } /** @@ -1100,23 +1039,19 @@ gboolean gvir_storage_pool_set_autostart(GVirStoragePool *pool, } static void -gvir_storage_pool_delete_helper(GSimpleAsyncResult *res, - GObject *object, +gvir_storage_pool_delete_helper(GTask *task, + gpointer source_object, + gpointer task_data, GCancellable *cancellable G_GNUC_UNUSED) { - GVirStoragePool *pool = GVIR_STORAGE_POOL(object); - StoragePoolBuildData *data; + GVirStoragePool *pool = GVIR_STORAGE_POOL(source_object); + guint flags = GPOINTER_TO_UINT(task_data); GError *err = NULL; - data = (StoragePoolBuildData *) g_object_get_data(G_OBJECT(res), - "StoragePoolBuildData"); - - if (!gvir_storage_pool_delete(pool, data->flags, &err)) { - g_simple_async_result_set_from_error(res, err); - g_error_free(err); - } - - g_slice_free (StoragePoolBuildData, data); + if (!gvir_storage_pool_delete(pool, flags, &err)) + g_task_return_error(task, err); + else + g_task_return_boolean(task, TRUE); } /** @@ -1133,25 +1068,18 @@ void gvir_storage_pool_delete_async (GVirStoragePool *pool, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; - StoragePoolBuildData *data; + GTask *task; g_return_if_fail(GVIR_IS_STORAGE_POOL(pool)); g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable)); - data = g_slice_new0(StoragePoolBuildData); - data->flags = flags; - - res = g_simple_async_result_new(G_OBJECT(pool), - callback, - user_data, - gvir_storage_pool_delete_async); - g_object_set_data(G_OBJECT(res), "StoragePoolBuildData", data); - g_simple_async_result_run_in_thread(res, - gvir_storage_pool_delete_helper, - G_PRIORITY_DEFAULT, - cancellable); - g_object_unref(res); + task = g_task_new(G_OBJECT(pool), + cancellable, + callback, + user_data); + g_task_set_task_data(task, GUINT_TO_POINTER(flags), NULL); + g_task_run_in_thread(task, gvir_storage_pool_delete_helper); + g_object_unref(task); } /** @@ -1167,16 +1095,10 @@ gboolean gvir_storage_pool_delete_finish(GVirStoragePool *pool, GError **err) { g_return_val_if_fail(GVIR_IS_STORAGE_POOL(pool), FALSE); - g_return_val_if_fail(g_simple_async_result_is_valid(result, G_OBJECT(pool), - gvir_storage_pool_delete_async), - FALSE); + g_return_val_if_fail(g_task_is_valid(result, pool), FALSE); g_return_val_if_fail(err == NULL || *err == NULL, FALSE); - if (g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(result), - err)) - return FALSE; - - return TRUE; + return g_task_propagate_boolean(G_TASK(result), err); } G_GNUC_INTERNAL void gvir_storage_pool_delete_vol(GVirStoragePool *pool, diff --git a/libvirt-gobject/libvirt-gobject-stream.c b/libvirt-gobject/libvirt-gobject-stream.c index 46dbd9a..2bb3e20 100644 --- a/libvirt-gobject/libvirt-gobject-stream.c +++ b/libvirt-gobject/libvirt-gobject-stream.c @@ -129,14 +129,11 @@ static gboolean gvir_stream_close(GIOStream *io_stream, return (i_ret && o_ret); } - -static void gvir_stream_close_async(GIOStream *stream, - int io_priority G_GNUC_UNUSED, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) +static gboolean close_in_idle (gpointer data) { - GSimpleAsyncResult *res; + GTask *task = G_TASK (data); + GIOStream *stream = G_IO_STREAM(g_task_get_source_object (task)); + GCancellable *cancellable = g_task_get_cancellable (task); GIOStreamClass *class; GError *error; @@ -146,27 +143,42 @@ static void gvir_stream_close_async(GIOStream *stream, error = NULL; if (class->close_fn && !class->close_fn(stream, cancellable, &error)) { - g_simple_async_report_take_gerror_in_idle(G_OBJECT (stream), - callback, user_data, - error); - return; + g_task_return_error(task, error); + + goto exit; } - res = g_simple_async_result_new(G_OBJECT (stream), - callback, - user_data, - gvir_stream_close_async); - g_simple_async_result_complete_in_idle(res); - g_object_unref (res); + g_task_return_boolean(task, TRUE); +exit: + g_object_unref(task); + return FALSE; } +static void gvir_stream_close_async(GIOStream *stream, + int io_priority G_GNUC_UNUSED, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new(G_OBJECT(stream), + cancellable, + callback, + user_data); + g_idle_add(close_in_idle, task); +} static gboolean -gvir_stream_close_finish(GIOStream *stream G_GNUC_UNUSED, - GAsyncResult *result G_GNUC_UNUSED, - GError **error G_GNUC_UNUSED) +gvir_stream_close_finish(GIOStream *stream, + GAsyncResult *result, + GError **error) { - return TRUE; + g_return_val_if_fail(GVIR_IS_STREAM(stream), -1); + g_return_val_if_fail(g_task_is_valid(result, stream), -1); + g_return_val_if_fail(error == NULL || *error == NULL, -1); + + return g_task_propagate_boolean(G_TASK(result), error); } -- 2.5.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list