[PATCH 1/2] device: open timeout check in main state machine

Aleksander Morgado aleksander at aleksander.es
Tue Sep 12 08:52:34 UTC 2017


On Sun, Aug 6, 2017 at 5:08 PM, Aleksander Morgado
<aleksander at aleksander.es> wrote:
> Lets check if the operation timed out on the main state machine,
> instead of when the open command response is processed. This will
> allow us to queue up new steps sending/receiving messages and have
> a single place to check the timeout for all of them.
> ---

Pushed to git master.

>  src/libmbim-glib/mbim-device.c | 39 ++++++++++++++++++++++++---------------
>  1 file changed, 24 insertions(+), 15 deletions(-)
>
> diff --git a/src/libmbim-glib/mbim-device.c b/src/libmbim-glib/mbim-device.c
> index 4b7d431..775c2fd 100644
> --- a/src/libmbim-glib/mbim-device.c
> +++ b/src/libmbim-glib/mbim-device.c
> @@ -1214,14 +1214,16 @@ typedef enum {
>  } DeviceOpenContextStep;
>
>  typedef struct {
> -    DeviceOpenContextStep step;
> -    MbimDeviceOpenFlags flags;
> -    gint timeout;
> +    DeviceOpenContextStep  step;
> +    MbimDeviceOpenFlags    flags;
> +    guint                  timeout;
> +    GTimer                *timer;
>  } DeviceOpenContext;
>
>  static void
>  device_open_context_free (DeviceOpenContext *ctx)
>  {
> +    g_timer_destroy (ctx->timer);
>      g_slice_free (DeviceOpenContext, ctx);
>  }
>
> @@ -1278,20 +1280,14 @@ open_message_ready (MbimDevice   *self,
>
>      response = mbim_device_command_finish (self, res, &error);
>      if (!response) {
> -        /* Check if we should be retrying */
> +        /* Check if we should be retrying after a timeout */
>          if (g_error_matches (error, MBIM_CORE_ERROR, MBIM_CORE_ERROR_TIMEOUT)) {
> -            /* The timeout will tell us how many retries we should do */
> -            ctx->timeout -= RETRY_TIMEOUT_SECS;
> -            if (ctx->timeout > 0) {
> -                g_error_free (error);
> -                open_message (task);
> -                return;
> -            }
> -
> -            /* No more seconds left in the timeout... return error */
> +            /* Retry same step */
> +            device_open_context_step (task);
> +            return;
>          }
>
> -        g_debug ("open operation timed out: closed");
> +        g_debug ("error reported in open operation: closed");
>          self->priv->open_status = OPEN_STATUS_CLOSED;
>          g_task_return_error (task, error);
>          g_object_unref (task);
> @@ -1416,6 +1412,18 @@ device_open_context_step (GTask *task)
>      self = g_task_get_source_object (task);
>      ctx = g_task_get_task_data (task);
>
> +    /* Timed out? */
> +    if (g_timer_elapsed (ctx->timer, NULL) > ctx->timeout) {
> +        g_debug ("open operation timed out: closed");
> +        self->priv->open_status = OPEN_STATUS_CLOSED;
> +        g_task_return_new_error (task,
> +                                 MBIM_CORE_ERROR,
> +                                 MBIM_CORE_ERROR_TIMEOUT,
> +                                 "Operation timed out: device is closed");
> +        g_object_unref (task);
> +        return;
> +    }
> +
>      switch (ctx->step) {
>      case DEVICE_OPEN_CONTEXT_STEP_FIRST:
>          if (self->priv->open_status == OPEN_STATUS_OPEN) {
> @@ -1512,10 +1520,11 @@ mbim_device_open_full (MbimDevice          *self,
>      g_return_if_fail (MBIM_IS_DEVICE (self));
>      g_return_if_fail (timeout > 0);
>
> -    ctx = g_slice_new (DeviceOpenContext);
> +    ctx = g_slice_new0 (DeviceOpenContext);
>      ctx->step = DEVICE_OPEN_CONTEXT_STEP_FIRST;
>      ctx->flags = flags;
>      ctx->timeout = timeout;
> +    ctx->timer = g_timer_new ();
>
>      task = g_task_new (self, cancellable, callback, user_data);
>      g_task_set_task_data (task, ctx, (GDestroyNotify)device_open_context_free);
> --
> 2.13.3
>



-- 
Aleksander
https://aleksander.es


More information about the libmbim-devel mailing list