[PATCH] mbim-proxy: port internal device open to GTask
Aleksander Morgado
aleksander at aleksander.es
Sun Oct 8 08:31:45 UTC 2017
On 19/08/17 12:35, Aleksander Morgado wrote:
> ---
> src/libmbim-glib/mbim-proxy.c | 83 +++++++++++++++++++++----------------------
> 1 file changed, 40 insertions(+), 43 deletions(-)
>
This is also now in git master.
> diff --git a/src/libmbim-glib/mbim-proxy.c b/src/libmbim-glib/mbim-proxy.c
> index d59a4de..0e83f60 100644
> --- a/src/libmbim-glib/mbim-proxy.c
> +++ b/src/libmbim-glib/mbim-proxy.c
> @@ -391,18 +391,14 @@ request_new (MbimProxy *self,
> /* Internal proxy device opening operation */
>
> typedef struct {
> - MbimProxy *self;
> - MbimDevice *device;
> - guint32 timeout_secs;
> - GSimpleAsyncResult *result;
> + MbimDevice *device;
> + guint32 timeout_secs;
> } InternalDeviceOpenContext;
>
> static void
> internal_device_open_context_free (InternalDeviceOpenContext *ctx)
> {
> - g_object_unref (ctx->result);
> g_object_unref (ctx->device);
> - g_object_unref (ctx->self);
> g_slice_free (InternalDeviceOpenContext, ctx);
> }
>
> @@ -411,7 +407,7 @@ internal_device_open_finish (MbimProxy *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);
> }
>
> typedef struct {
> @@ -425,16 +421,15 @@ opening_device_complete_and_free (OpeningDevice *info,
> {
> GList *l;
>
> - /* Complete all pending open actions */
> + /* Complete all pending open tasks */
> for (l = info->pending; l; l = g_list_next (l)) {
> - GSimpleAsyncResult *simple = (GSimpleAsyncResult *)(l->data);
> + GTask *task = (GTask *)(l->data);
>
> if (error)
> - g_simple_async_result_set_from_error (simple, error);
> + g_task_return_error (task, g_error_copy (error));
> else
> - g_simple_async_result_set_op_res_gboolean (simple, TRUE);
> - g_simple_async_result_complete_in_idle (simple);
> - g_object_unref (simple);
> + g_task_return_boolean (task, TRUE);
> + g_object_unref (task);
> }
>
> g_list_free (info->pending);
> @@ -511,24 +506,27 @@ device_open_ready (MbimDevice *device,
> }
>
> static void
> -internal_open (InternalDeviceOpenContext *ctx)
> +internal_open (GTask *task)
> {
> - OpeningDevice *info;
> + MbimProxy *self;
> + InternalDeviceOpenContext *ctx;
> + OpeningDevice *info;
> +
> + self = g_task_get_source_object (task);
> + ctx = g_task_get_task_data (task);
>
> /* If already being opened, queue it up */
> - info = peek_opening_device_info (ctx->self, ctx->device);
> + info = peek_opening_device_info (self, ctx->device);
> if (info) {
> - /* Propagate result object from context */
> - info->pending = g_list_append (info->pending, g_object_ref (ctx->result));
> - internal_device_open_context_free (ctx);
> + info->pending = g_list_append (info->pending, task);
> return;
> }
>
> - /* First time opening, go on */
> + /* First time opening */
> info = g_slice_new0 (OpeningDevice);
> info->device = g_object_ref (ctx->device);
> - info->pending = g_list_append (info->pending, g_object_ref (ctx->result));
> - ctx->self->priv->opening_devices = g_list_prepend (ctx->self->priv->opening_devices, info);
> + info->pending = g_list_append (info->pending, task);
> + self->priv->opening_devices = g_list_prepend (self->priv->opening_devices, info);
>
> /* Note: for now, only the first timeout request is taken into account */
>
> @@ -538,22 +536,23 @@ internal_open (InternalDeviceOpenContext *ctx)
> ctx->timeout_secs,
> NULL,
> (GAsyncReadyCallback)device_open_ready,
> - g_object_ref (ctx->self));
> -
> - internal_device_open_context_free (ctx);
> + g_object_ref (self));
> }
>
> static void
> -internal_device_open_caps_query_ready (MbimDevice *device,
> - GAsyncResult *res,
> - InternalDeviceOpenContext *ctx)
> +internal_device_open_caps_query_ready (MbimDevice *device,
> + GAsyncResult *res,
> + GTask *task)
> {
> - GError *error = NULL;
> + MbimProxy *self;
> + GError *error = NULL;
> MbimMessage *response;
> - GList *l;
> + GList *l;
> +
> + self = g_task_get_source_object (task);
>
> /* Always unblock all signals from all clients */
> - for (l = ctx->self->priv->clients; l; l = g_list_next (l))
> + for (l = self->priv->clients; l; l = g_list_next (l))
> g_signal_handlers_unblock_by_func (device, client_error_cb, l->data);
>
> response = mbim_device_command_finish (device, res, &error);
> @@ -562,7 +561,7 @@ internal_device_open_caps_query_ready (MbimDevice *device,
> if (g_error_matches (error, MBIM_PROTOCOL_ERROR, MBIM_PROTOCOL_ERROR_NOT_OPENED)) {
> g_debug ("device not-opened error reported, reopening");
> mbim_device_close_force (device, NULL);
> - internal_open (ctx);
> + internal_open (task);
> if (response)
> mbim_message_unref (response);
> g_error_free (error);
> @@ -574,9 +573,8 @@ internal_device_open_caps_query_ready (MbimDevice *device,
> g_error_free (error);
> }
>
> - g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
> - g_simple_async_result_complete (ctx->result);
> - internal_device_open_context_free (ctx);
> + g_task_return_boolean (task, TRUE);
> + g_object_unref (task);
>
> if (response)
> mbim_message_unref (response);
> @@ -590,15 +588,14 @@ internal_device_open (MbimProxy *self,
> gpointer user_data)
> {
> InternalDeviceOpenContext *ctx;
> + GTask *task;
> +
> + task = g_task_new (self, NULL, callback, user_data);
>
> ctx = g_slice_new0 (InternalDeviceOpenContext);
> - ctx->self = g_object_ref (self);
> - ctx->device = g_object_ref (device);
> + ctx->device = g_object_ref (device);
> ctx->timeout_secs = timeout_secs;
> - ctx->result = g_simple_async_result_new (G_OBJECT (self),
> - callback,
> - user_data,
> - internal_device_open);
> + g_task_set_task_data (task, ctx, (GDestroyNotify) internal_device_open_context_free);
>
> /* If the device is flagged as already open, we still want to check
> * whether that's totally true, and we do that with a standard command
> @@ -620,12 +617,12 @@ internal_device_open (MbimProxy *self,
> 5,
> NULL,
> (GAsyncReadyCallback)internal_device_open_caps_query_ready,
> - ctx);
> + task);
> mbim_message_unref (message);
> return;
> }
>
> - internal_open (ctx);
> + internal_open (task);
> }
>
> /*****************************************************************************/
>
--
Aleksander
https://aleksander.es
More information about the libmbim-devel
mailing list