[Spice-devel] [PATCH 09/14] usb-acl-helper: Use GTask instead of GSimpleAsyncResult

Fabiano FidĂȘncio fidencio at redhat.com
Mon Jan 18 01:05:45 PST 2016


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);
     return;
 
 done:
     spice_usb_acl_helper_cleanup(self);
-    g_simple_async_result_complete_in_idle(result);
-    g_object_unref(result);
+    g_object_unref(task);
 }
 
 G_GNUC_INTERNAL
 gboolean spice_usb_acl_helper_open_acl_finish(
     SpiceUsbAclHelper *self, GAsyncResult *res, GError **err)
 {
-    GSimpleAsyncResult *result = G_SIMPLE_ASYNC_RESULT(res);
+    GTask *task = G_TASK(res);
 
-    g_return_val_if_fail(g_simple_async_result_is_valid(res, G_OBJECT(self),
-                                               spice_usb_acl_helper_open_acl),
+    g_return_val_if_fail(g_task_is_valid(task, self),
                          FALSE);
 
-    if (g_simple_async_result_propagate_error(result, err))
-        return FALSE;
-
-    return TRUE;
+    return g_task_propagate_boolean(task, err);
 }
 
 G_GNUC_INTERNAL
@@ -290,10 +286,8 @@ void spice_usb_acl_helper_close_acl(SpiceUsbAclHelper *self)
     SpiceUsbAclHelperPrivate *priv = self->priv;
 
     /* If the acl open has not completed yet report it as cancelled */
-    if (priv->result) {
-        async_result_set_cancelled(priv->result);
-        g_simple_async_result_complete_in_idle(priv->result);
-    }
+    if (priv->task)
+        async_result_set_cancelled(priv->task);
 
     spice_usb_acl_helper_cleanup(self);
 }
-- 
2.5.0



More information about the Spice-devel mailing list