[libvirt] [libvirt-glib v5] gobject: Port to GTask API
Christophe Fergeau
cfergeau at redhat.com
Thu Nov 26 10:20:01 UTC 2015
Hey,
Still a couple of comments :(
On Wed, Nov 25, 2015 at 09:46:58PM +0000, Zeeshan Ali (Khattak) wrote:
> 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
> @@ -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);
g_task_return_error() takes ownership of its GError argument, so the
code should be:
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");
g_error_free (error);
} else {
g_task_return_error(task, error);
}
}
> 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
> @@ -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);
Same comment here
> 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
> @@ -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);
g_return_val_if_fail(.., FALSE);
ACK with these issues fixed.
Christophe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20151126/d14affa9/attachment-0001.sig>
More information about the libvir-list
mailing list