[PATCH 09/10] iface-modem: port internal_load_unlock_required to use GTask
Aleksander Morgado
aleksander at aleksander.es
Fri Jun 30 10:45:19 UTC 2017
On 30/06/17 11:23, Ben Chan wrote:
> ---
> src/mm-iface-modem.c | 85 +++++++++++++++++++++++++++-------------------------
> 1 file changed, 45 insertions(+), 40 deletions(-)
>
Pushed to git master, thanks.
> diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c
> index e084e1da..586f5565 100644
> --- a/src/mm-iface-modem.c
> +++ b/src/mm-iface-modem.c
> @@ -217,18 +217,13 @@ mm_iface_modem_wait_for_final_state (MMIfaceModem *self,
> #define MAX_RETRIES 6
>
> typedef struct {
> - MMIfaceModem *self;
> - GSimpleAsyncResult *result;
> guint retries;
> guint pin_check_timeout_id;
> } InternalLoadUnlockRequiredContext;
>
> static void
> -internal_load_unlock_required_context_complete_and_free (InternalLoadUnlockRequiredContext *ctx)
> +internal_load_unlock_required_context_free (InternalLoadUnlockRequiredContext *ctx)
> {
> - g_simple_async_result_complete_in_idle (ctx->result);
> - g_object_unref (ctx->result);
> - g_object_unref (ctx->self);
> g_slice_free (InternalLoadUnlockRequiredContext, ctx);
> }
>
> @@ -237,31 +232,38 @@ internal_load_unlock_required_finish (MMIfaceModem *self,
> GAsyncResult *res,
> GError **error)
> {
> - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error))
> - return MM_MODEM_LOCK_UNKNOWN;
> + gssize value;
> +
> + value = g_task_propagate_int (G_TASK (res), error);
>
> - return (MMModemLock) GPOINTER_TO_UINT (g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res)));
> + return value < 0 ? MM_MODEM_LOCK_UNKNOWN : (MMModemLock)value;
> }
>
> -static void internal_load_unlock_required_context_step (InternalLoadUnlockRequiredContext *ctx);
> +static void internal_load_unlock_required_context_step (GTask *task);
>
> static gboolean
> -load_unlock_required_again (InternalLoadUnlockRequiredContext *ctx)
> +load_unlock_required_again (GTask *task)
> {
> + InternalLoadUnlockRequiredContext *ctx;
> +
> + ctx = g_task_get_task_data (task);
> ctx->pin_check_timeout_id = 0;
> /* Retry the step */
> - internal_load_unlock_required_context_step (ctx);
> + internal_load_unlock_required_context_step (task);
> return G_SOURCE_REMOVE;
> }
>
> static void
> load_unlock_required_ready (MMIfaceModem *self,
> GAsyncResult *res,
> - InternalLoadUnlockRequiredContext *ctx)
> + GTask *task)
> {
> + InternalLoadUnlockRequiredContext *ctx;
> GError *error = NULL;
> MMModemLock lock;
>
> + ctx = g_task_get_task_data (task);
> +
> lock = MM_IFACE_MODEM_GET_INTERFACE (self)->load_unlock_required_finish (self, res, &error);
> if (error) {
> mm_dbg ("Couldn't check if unlock required: '%s'", error->message);
> @@ -280,8 +282,8 @@ load_unlock_required_ready (MMIfaceModem *self,
> g_error_matches (error,
> MM_MOBILE_EQUIPMENT_ERROR,
> MM_MOBILE_EQUIPMENT_ERROR_SIM_WRONG)) {
> - g_simple_async_result_take_error (ctx->result, error);
> - internal_load_unlock_required_context_complete_and_free (ctx);
> + g_task_return_error (task, error);
> + g_object_unref (task);
> return;
> }
>
> @@ -293,37 +295,41 @@ load_unlock_required_ready (MMIfaceModem *self,
> g_assert (ctx->pin_check_timeout_id == 0);
> ctx->pin_check_timeout_id = g_timeout_add_seconds (2,
> (GSourceFunc)load_unlock_required_again,
> - ctx);
> + task);
> g_error_free (error);
> return;
> }
>
> /* If reached max retries and still reporting error... default to SIM error */
> g_error_free (error);
> - g_simple_async_result_set_error (ctx->result,
> - MM_MOBILE_EQUIPMENT_ERROR,
> - MM_MOBILE_EQUIPMENT_ERROR_SIM_FAILURE,
> - "Couldn't get SIM lock status after %u retries",
> - MAX_RETRIES);
> - internal_load_unlock_required_context_complete_and_free (ctx);
> + g_task_return_new_error (task,
> + MM_MOBILE_EQUIPMENT_ERROR,
> + MM_MOBILE_EQUIPMENT_ERROR_SIM_FAILURE,
> + "Couldn't get SIM lock status after %u retries",
> + MAX_RETRIES);
> + g_object_unref (task);
> return;
> }
>
> /* Got the lock value, return it */
> - g_simple_async_result_set_op_res_gpointer (ctx->result,
> - GUINT_TO_POINTER (lock),
> - NULL);
> - internal_load_unlock_required_context_complete_and_free (ctx);
> + g_task_return_int (task, lock);
> + g_object_unref (task);
> }
>
> static void
> -internal_load_unlock_required_context_step (InternalLoadUnlockRequiredContext *ctx)
> +internal_load_unlock_required_context_step (GTask *task)
> {
> + MMIfaceModem *self;
> + InternalLoadUnlockRequiredContext *ctx;
> +
> + self = g_task_get_source_object (task);
> + ctx = g_task_get_task_data (task);
> +
> g_assert (ctx->pin_check_timeout_id == 0);
> - MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_unlock_required (
> - ctx->self,
> + MM_IFACE_MODEM_GET_INTERFACE (self)->load_unlock_required (
> + self,
> (GAsyncReadyCallback)load_unlock_required_ready,
> - ctx);
> + task);
> }
>
> static void
> @@ -332,23 +338,22 @@ internal_load_unlock_required (MMIfaceModem *self,
> gpointer user_data)
> {
> InternalLoadUnlockRequiredContext *ctx;
> + GTask *task;
>
> ctx = g_slice_new0 (InternalLoadUnlockRequiredContext);
> - ctx->self = g_object_ref (self);
> - ctx->result = g_simple_async_result_new (G_OBJECT (self),
> - callback,
> - user_data,
> - internal_load_unlock_required);
>
> - if (!MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_unlock_required ||
> - !MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_unlock_required_finish) {
> + task = g_task_new (self, NULL, callback, user_data);
> + g_task_set_task_data (task, ctx, (GDestroyNotify)internal_load_unlock_required_context_free);
> +
> + if (!MM_IFACE_MODEM_GET_INTERFACE (self)->load_unlock_required ||
> + !MM_IFACE_MODEM_GET_INTERFACE (self)->load_unlock_required_finish) {
> /* Just assume that no lock is required */
> - g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
> - internal_load_unlock_required_context_complete_and_free (ctx);
> + g_task_return_boolean (task, TRUE);
> + g_object_unref (task);
> return;
> }
>
> - internal_load_unlock_required_context_step (ctx);
> + internal_load_unlock_required_context_step (task);
> }
>
> /*****************************************************************************/
>
--
Aleksander
https://aleksander.es
More information about the ModemManager-devel
mailing list