On Mon, Jan 18, 2016 at 10:05:45AM +0100, Fabiano Fidêncio wrote: > Instead of using GSimpleAsyncResult, use the new GTask API, which is > much more straightforward. > --- > src/usb-acl-helper.c | 76 ++++++++++++++++++++++++---------------------------- > 1 file changed, 35 insertions(+), 41 deletions(-) > > diff --git a/src/usb-acl-helper.c b/src/usb-acl-helper.c > index 6a49627..17e2b3c 100644 > --- a/src/usb-acl-helper.c > +++ b/src/usb-acl-helper.c > @@ -35,10 +35,9 @@ > (G_TYPE_INSTANCE_GET_PRIVATE ((obj), SPICE_TYPE_USB_ACL_HELPER, SpiceUsbAclHelperPrivate)) > > struct _SpiceUsbAclHelperPrivate { > - GSimpleAsyncResult *result; > + GTask *task; > GIOChannel *in_ch; > GIOChannel *out_ch; > - GCancellable *cancellable; > gulong cancellable_id; > }; > > @@ -53,11 +52,11 @@ static void spice_usb_acl_helper_cleanup(SpiceUsbAclHelper *self) > { > SpiceUsbAclHelperPrivate *priv = self->priv; > > - g_cancellable_disconnect(priv->cancellable, priv->cancellable_id); > - priv->cancellable = NULL; > + g_cancellable_disconnect(g_task_get_cancellable(priv->task), > + priv->cancellable_id); > priv->cancellable_id = 0; > > - g_clear_object(&priv->result); > + g_clear_object(&priv->task); > > if (priv->in_ch) { > g_io_channel_unref(priv->in_ch); > @@ -90,9 +89,9 @@ static void spice_usb_acl_helper_class_init(SpiceUsbAclHelperClass *klass) > /* ------------------------------------------------------------------ */ > /* callbacks */ > > -static void async_result_set_cancelled(GSimpleAsyncResult *result) > +static void async_result_set_cancelled(GTask *task) > { > - g_simple_async_result_set_error(result, > + g_task_return_new_error(task, > G_IO_ERROR, G_IO_ERROR_CANCELLED, > "Setting USB device node ACL cancelled"); > } > @@ -105,12 +104,13 @@ static gboolean cb_out_watch(GIOChannel *channel, > SpiceUsbAclHelperPrivate *priv = self->priv; > gboolean success = FALSE; > GError *err = NULL; > + GCancellable *cancellable; > GIOStatus status; > gchar *string; > gsize size; > > /* Check that we've not been cancelled */ > - if (priv->result == NULL) > + if (priv->task == NULL) > goto done; > > g_return_val_if_fail(channel == priv->out_ch, FALSE); > @@ -121,10 +121,11 @@ static gboolean cb_out_watch(GIOChannel *channel, > string[strlen(string) - 1] = 0; > if (!strcmp(string, "SUCCESS")) { > success = TRUE; > + g_task_return_boolean(priv->task, TRUE); > } else if (!strcmp(string, "CANCELED")) { > - async_result_set_cancelled(priv->result); > + async_result_set_cancelled(priv->task); > } else { > - g_simple_async_result_set_error(priv->result, > + g_task_return_new_error(priv->task, > SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED, > "Error setting USB device node ACL: '%s'", > string); > @@ -132,10 +133,10 @@ static gboolean cb_out_watch(GIOChannel *channel, > g_free(string); > break; > case G_IO_STATUS_ERROR: > - g_simple_async_result_take_error(priv->result, err); > + g_task_return_error(priv->task, err); > break; > case G_IO_STATUS_EOF: > - g_simple_async_result_set_error(priv->result, > + g_task_return_new_error(priv->task, > SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED, > "Unexpected EOF reading from acl helper stdout"); > break; > @@ -143,16 +144,16 @@ static gboolean cb_out_watch(GIOChannel *channel, > return TRUE; /* Wait for more input */ > } > > - g_cancellable_disconnect(priv->cancellable, priv->cancellable_id); > - priv->cancellable = NULL; > + cancellable = g_task_get_cancellable(priv->task); > + g_cancellable_disconnect(cancellable, priv->cancellable_id); > + cancellable = NULL; > priv->cancellable_id = 0; > > - g_simple_async_result_complete_in_idle(priv->result); > - g_clear_object(&priv->result); > - > if (!success) > spice_usb_acl_helper_cleanup(self); > > + g_clear_object(&priv->task); > + > done: > g_object_unref(self); > return FALSE; > @@ -193,7 +194,7 @@ void spice_usb_acl_helper_open_acl(SpiceUsbAclHelper *self, > g_return_if_fail(SPICE_IS_USB_ACL_HELPER(self)); > > SpiceUsbAclHelperPrivate *priv = self->priv; > - GSimpleAsyncResult *result; > + GTask *task; > GError *err = NULL; > GIOStatus status; > GPid helper_pid; > @@ -202,25 +203,24 @@ void spice_usb_acl_helper_open_acl(SpiceUsbAclHelper *self, > gint in, out; > gchar buf[128]; > > - result = g_simple_async_result_new(G_OBJECT(self), callback, user_data, > - spice_usb_acl_helper_open_acl); > + task = g_task_new(self, cancellable, callback, user_data); > > if (priv->out_ch) { > - g_simple_async_result_set_error(result, > + g_task_return_new_error(task, > SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED, > "Error acl-helper already has an acl open"); > goto done; > } > > if (g_cancellable_set_error_if_cancelled(cancellable, &err)) { > - g_simple_async_result_take_error(result, err); > + g_task_return_error(task, err); > goto done; > } > > if (!g_spawn_async_with_pipes(NULL, argv, NULL, > G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH, > NULL, NULL, &helper_pid, &in, &out, NULL, &err)) { > - g_simple_async_result_take_error(result, err); > + g_task_return_error(task, err); > goto done; > } > g_child_watch_add(helper_pid, helper_child_watch_cb, NULL); > @@ -232,7 +232,7 @@ void spice_usb_acl_helper_open_acl(SpiceUsbAclHelper *self, > g_io_channel_set_close_on_unref(priv->out_ch, TRUE); > status = g_io_channel_set_flags(priv->out_ch, G_IO_FLAG_NONBLOCK, &err); > if (status != G_IO_STATUS_NORMAL) { > - g_simple_async_result_take_error(result, err); > + g_task_return_error(task, err); > goto done; > } > > @@ -240,46 +240,42 @@ void spice_usb_acl_helper_open_acl(SpiceUsbAclHelper *self, > status = g_io_channel_write_chars(priv->in_ch, buf, -1, > &bytes_written, &err); > if (status != G_IO_STATUS_NORMAL) { > - g_simple_async_result_take_error(result, err); > + g_task_return_error(task, err); > goto done; > } > status = g_io_channel_flush(priv->in_ch, &err); > if (status != G_IO_STATUS_NORMAL) { > - g_simple_async_result_take_error(result, err); > + g_task_return_error(task, err); > goto done; > } > > - priv->result = result; > + priv->task = task; > if (cancellable) { > - priv->cancellable = cancellable; > priv->cancellable_id = g_cancellable_connect(cancellable, > G_CALLBACK(cancelled_cb), > self, NULL); > } > g_io_add_watch(priv->out_ch, G_IO_IN|G_IO_HUP, > (GIOFunc)cb_out_watch, g_object_ref(self)); > + > + g_task_return_boolean(task, TRUE); I don't think the GTask should return here, but that we should wait for cb_out_watch() to complete (ie call g_task_return_boolean) instead (which it's doing after this patch). Christophe
Attachment:
signature.asc
Description: PGP signature
_______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel