[PATCH 2/4] libmbim-glib, device: port mbim_device_open_full to use GTask

Ben Chan benchan at chromium.org
Tue May 2 13:27:11 UTC 2017


---
 src/libmbim-glib/mbim-device.c | 159 ++++++++++++++++++++++-------------------
 1 file changed, 84 insertions(+), 75 deletions(-)

diff --git a/src/libmbim-glib/mbim-device.c b/src/libmbim-glib/mbim-device.c
index ece4f84..2b79672 100644
--- a/src/libmbim-glib/mbim-device.c
+++ b/src/libmbim-glib/mbim-device.c
@@ -1202,32 +1202,18 @@ typedef enum {
 } DeviceOpenContextStep;
 
 typedef struct {
-    MbimDevice *self;
-    GSimpleAsyncResult *result;
-    GCancellable *cancellable;
     DeviceOpenContextStep step;
     MbimDeviceOpenFlags flags;
     gint timeout;
 } DeviceOpenContext;
 
 static void
-device_open_context_complete_and_free (DeviceOpenContext *ctx,
-                                       GError            *error)
+device_open_context_free (DeviceOpenContext *ctx)
 {
-    if (error)
-        g_simple_async_result_take_error (ctx->result, error);
-    else
-        g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
-
-    g_simple_async_result_complete_in_idle (ctx->result);
-    g_object_unref (ctx->result);
-    if (ctx->cancellable)
-        g_object_unref (ctx->cancellable);
-    g_object_unref (ctx->self);
     g_slice_free (DeviceOpenContext, ctx);
 }
 
-static void device_open_context_step (DeviceOpenContext *ctx);
+static void device_open_context_step (GTask *task);
 
 /**
  * mbim_device_open_full_finish:
@@ -1244,7 +1230,7 @@ mbim_device_open_full_finish (MbimDevice    *self,
                               GAsyncResult  *res,
                               GError       **error)
 {
-    return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error);
+    return g_task_propagate_boolean (G_TASK (res), error);
 }
 
 /**
@@ -1265,16 +1251,19 @@ mbim_device_open_finish (MbimDevice   *self,
     return mbim_device_open_full_finish (self, res, error);
 }
 
-static void open_message (DeviceOpenContext *ctx);
+static void open_message (GTask *task);
 
 static void
-open_message_ready (MbimDevice        *self,
-                    GAsyncResult      *res,
-                    DeviceOpenContext *ctx)
+open_message_ready (MbimDevice   *self,
+                    GAsyncResult *res,
+                    GTask        *task)
 {
+    DeviceOpenContext *ctx;
     MbimMessage *response;
     GError *error = NULL;
 
+    ctx = g_task_get_task_data (task);
+
     response = mbim_device_command_finish (self, res, &error);
     if (!response) {
         /* Check if we should be retrying */
@@ -1283,7 +1272,7 @@ open_message_ready (MbimDevice        *self,
             ctx->timeout -= RETRY_TIMEOUT_SECS;
             if (ctx->timeout > 0) {
                 g_error_free (error);
-                open_message (ctx);
+                open_message (task);
                 return;
             }
 
@@ -1292,15 +1281,17 @@ open_message_ready (MbimDevice        *self,
 
         g_debug ("open operation timed out: closed");
         self->priv->open_status = OPEN_STATUS_CLOSED;
-        device_open_context_complete_and_free (ctx, error);
+        g_task_return_error (task, error);
+        g_object_unref (task);
         return;
     }
 
     if (!mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_OPEN_DONE, &error)) {
         g_debug ("getting open done result failed: closed");
         self->priv->open_status = OPEN_STATUS_CLOSED;
-        device_open_context_complete_and_free (ctx, error);
         mbim_message_unref (response);
+        g_task_return_error (task, error);
+        g_object_unref (task);
         return;
     }
 
@@ -1308,129 +1299,148 @@ open_message_ready (MbimDevice        *self,
 
     /* go on */
     ctx->step++;
-    device_open_context_step (ctx);
+    device_open_context_step (task);
 }
 
 static void
-open_message (DeviceOpenContext *ctx)
+open_message (GTask *task)
 {
+    MbimDevice *self;
     MbimMessage *request;
 
+    self = g_task_get_source_object (task);
+
     /* Launch 'Open' command */
-    request = mbim_message_open_new (mbim_device_get_next_transaction_id (ctx->self),
-                                     ctx->self->priv->max_control_transfer);
-    mbim_device_command (ctx->self,
+    request = mbim_message_open_new (mbim_device_get_next_transaction_id (self),
+                                     self->priv->max_control_transfer);
+    mbim_device_command (self,
                          request,
                          RETRY_TIMEOUT_SECS,
-                         ctx->cancellable,
+                         g_task_get_cancellable (task),
                          (GAsyncReadyCallback)open_message_ready,
-                         ctx);
+                         task);
     mbim_message_unref (request);
 }
 
 static void
-proxy_cfg_message_ready (MbimDevice        *self,
-                         GAsyncResult      *res,
-                         DeviceOpenContext *ctx)
+proxy_cfg_message_ready (MbimDevice   *self,
+                         GAsyncResult *res,
+                         GTask        *task)
 {
+    DeviceOpenContext *ctx;
     MbimMessage *response;
     GError *error = NULL;
 
+    ctx = g_task_get_task_data (task);
+
     response = mbim_device_command_finish (self, res, &error);
     if (!response) {
         /* Hard error if proxy cfg command fails */
         g_debug ("proxy configuration failed: closed");
         self->priv->open_status = OPEN_STATUS_CLOSED;
-        device_open_context_complete_and_free (ctx, error);
+        g_task_return_error (task, error);
+        g_object_unref (task);
         return;
     }
 
     mbim_message_unref (response);
 
     ctx->step++;
-    device_open_context_step (ctx);
+    device_open_context_step (task);
 }
 
 static void
-proxy_cfg_message (DeviceOpenContext *ctx)
+proxy_cfg_message (GTask *task)
 {
+    MbimDevice *self;
+    DeviceOpenContext *ctx;
     GError *error = NULL;
     MbimMessage *request;
 
-    request = mbim_message_proxy_control_configuration_set_new (ctx->self->priv->path, ctx->timeout, &error);
+    self = g_task_get_source_object (task);
+    ctx = g_task_get_task_data (task);
+
+    request = mbim_message_proxy_control_configuration_set_new (self->priv->path, ctx->timeout, &error);
 
     /* This message is no longer a direct reply; as the proxy will also try to open the device
      * directly. If it cannot open the device, it will return an error. */
-    mbim_device_command (ctx->self,
+    mbim_device_command (self,
                          request,
                          ctx->timeout,
-                         ctx->cancellable,
+                         g_task_get_cancellable (task),
                          (GAsyncReadyCallback)proxy_cfg_message_ready,
-                         ctx);
+                         task);
     mbim_message_unref (request);
 }
 
 static void
 create_iochannel_ready (MbimDevice *self,
                         GAsyncResult *res,
-                        DeviceOpenContext *ctx)
+                        GTask *task)
 {
+    DeviceOpenContext *ctx;
     GError *error = NULL;
 
     if (!create_iochannel_finish (self, res, &error)) {
         g_debug ("creating iochannel failed: closed");
         self->priv->open_status = OPEN_STATUS_CLOSED;
-        device_open_context_complete_and_free (ctx, error);
+        g_task_return_error (task, error);
+        g_object_unref (task);
         return;
     }
 
     /* Go on */
+    ctx = g_task_get_task_data (task);
     ctx->step++;
-    device_open_context_step (ctx);
+    device_open_context_step (task);
 }
 
 static void
-device_open_context_step (DeviceOpenContext *ctx)
+device_open_context_step (GTask *task)
 {
+    MbimDevice *self;
+    DeviceOpenContext *ctx;
+
+    self = g_task_get_source_object (task);
+    ctx = g_task_get_task_data (task);
+
     switch (ctx->step) {
     case DEVICE_OPEN_CONTEXT_STEP_FIRST:
-        if (ctx->self->priv->open_status == OPEN_STATUS_OPEN) {
-            GError *error;
-
-            error = g_error_new (MBIM_CORE_ERROR,
-                                 MBIM_CORE_ERROR_WRONG_STATE,
-                                 "Already open");
-            device_open_context_complete_and_free (ctx, error);
+        if (self->priv->open_status == OPEN_STATUS_OPEN) {
+            g_task_return_new_error (task,
+                                     MBIM_CORE_ERROR,
+                                     MBIM_CORE_ERROR_WRONG_STATE,
+                                     "Already open");
+            g_object_unref (task);
             return;
         }
 
-        if (ctx->self->priv->open_status == OPEN_STATUS_OPENING) {
-            GError *error;
-
-            error = g_error_new (MBIM_CORE_ERROR,
-                                 MBIM_CORE_ERROR_WRONG_STATE,
-                                 "Already opening");
-            device_open_context_complete_and_free (ctx, error);
+        if (self->priv->open_status == OPEN_STATUS_OPENING) {
+            g_task_return_new_error (task,
+                                     MBIM_CORE_ERROR,
+                                     MBIM_CORE_ERROR_WRONG_STATE,
+                                     "Already opening");
+            g_object_unref (task);
             return;
         }
 
         g_debug ("opening device...");
-        g_assert (ctx->self->priv->open_status == OPEN_STATUS_CLOSED);
-        ctx->self->priv->open_status = OPEN_STATUS_OPENING;
+        g_assert (self->priv->open_status == OPEN_STATUS_CLOSED);
+        self->priv->open_status = OPEN_STATUS_OPENING;
 
         ctx->step++;
         /* Fall down */
 
     case DEVICE_OPEN_CONTEXT_STEP_CREATE_IOCHANNEL:
-        create_iochannel (ctx->self,
+        create_iochannel (self,
                           !!(ctx->flags & MBIM_DEVICE_OPEN_FLAGS_PROXY),
                           (GAsyncReadyCallback)create_iochannel_ready,
-                          ctx);
+                          task);
         return;
 
     case DEVICE_OPEN_CONTEXT_STEP_FLAGS_PROXY:
         if (ctx->flags & MBIM_DEVICE_OPEN_FLAGS_PROXY) {
-            proxy_cfg_message (ctx);
+            proxy_cfg_message (task);
             return;
         }
         ctx->step++;
@@ -1438,8 +1448,8 @@ device_open_context_step (DeviceOpenContext *ctx)
 
     case DEVICE_OPEN_CONTEXT_STEP_OPEN_MESSAGE:
         /* If the device is already in-session, avoid the open message */
-        if (!ctx->self->priv->in_session) {
-            open_message (ctx);
+        if (!self->priv->in_session) {
+            open_message (task);
             return;
         }
         ctx->step++;
@@ -1447,8 +1457,9 @@ device_open_context_step (DeviceOpenContext *ctx)
 
     case DEVICE_OPEN_CONTEXT_STEP_LAST:
         /* Nothing else to process, complete without error */
-        ctx->self->priv->open_status = OPEN_STATUS_OPEN;
-        device_open_context_complete_and_free (ctx, NULL);
+        self->priv->open_status = OPEN_STATUS_OPEN;
+        g_task_return_boolean (task, TRUE);
+        g_object_unref (task);
         return;
 
     default:
@@ -1484,23 +1495,21 @@ mbim_device_open_full (MbimDevice          *self,
                        gpointer             user_data)
 {
     DeviceOpenContext *ctx;
+    GTask *task;
 
     g_return_if_fail (MBIM_IS_DEVICE (self));
     g_return_if_fail (timeout > 0);
 
     ctx = g_slice_new (DeviceOpenContext);
-    ctx->self = g_object_ref (self);
-    ctx->result = g_simple_async_result_new (G_OBJECT (self),
-                                             callback,
-                                             user_data,
-                                             mbim_device_open_full);
     ctx->step = DEVICE_OPEN_CONTEXT_STEP_FIRST;
     ctx->flags = flags;
     ctx->timeout = timeout;
-    ctx->cancellable = (cancellable ? g_object_ref (cancellable) : NULL);
+
+    task = g_task_new (self, cancellable, callback, user_data);
+    g_task_set_task_data (task, ctx, (GDestroyNotify)device_open_context_free);
 
     /* Start processing */
-    device_open_context_step (ctx);
+    device_open_context_step (task);
 }
 
 /**
-- 
2.13.0.rc0.306.g87b477812d-goog



More information about the libmbim-devel mailing list