[PATCH 4/6] base-sim: port mm_base_sim_initialize to use GTask
Aleksander Morgado
aleksander at aleksander.es
Wed Jul 5 08:51:45 UTC 2017
On 04/07/17 20:40, Ben Chan wrote:
> ---
> src/mm-base-sim.c | 127 +++++++++++++++++++++++++-----------------------------
> 1 file changed, 58 insertions(+), 69 deletions(-)
>
Pushed to git master, thanks.
> diff --git a/src/mm-base-sim.c b/src/mm-base-sim.c
> index 37faeb20..500b8294 100644
> --- a/src/mm-base-sim.c
> +++ b/src/mm-base-sim.c
> @@ -1291,7 +1291,7 @@ load_operator_name (MMBaseSim *self,
> /*****************************************************************************/
>
> typedef struct _InitAsyncContext InitAsyncContext;
> -static void interface_initialization_step (InitAsyncContext *ctx);
> +static void interface_initialization_step (GTask *task);
>
> typedef enum {
> INITIALIZATION_STEP_FIRST,
> @@ -1303,23 +1303,10 @@ typedef enum {
> } InitializationStep;
>
> struct _InitAsyncContext {
> - GSimpleAsyncResult *result;
> - GCancellable *cancellable;
> - MMBaseSim *self;
> InitializationStep step;
> guint sim_identifier_tries;
> };
>
> -static void
> -init_async_context_free (InitAsyncContext *ctx)
> -{
> - g_object_unref (ctx->self);
> - g_object_unref (ctx->result);
> - if (ctx->cancellable)
> - g_object_unref (ctx->cancellable);
> - g_free (ctx);
> -}
> -
> MMBaseSim *
> mm_base_sim_new_finish (GAsyncResult *res,
> GError **error)
> @@ -1345,18 +1332,20 @@ initable_init_finish (GAsyncInitable *initable,
> GAsyncResult *result,
> GError **error)
> {
> - return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error);
> + return g_task_propagate_boolean (G_TASK (result), error);
> }
>
> static void
> load_sim_identifier_ready (MMBaseSim *self,
> GAsyncResult *res,
> - InitAsyncContext *ctx)
> + GTask *task)
> {
> + InitAsyncContext *ctx;
> GError *error = NULL;
> gchar *simid;
>
> - simid = MM_BASE_SIM_GET_CLASS (ctx->self)->load_sim_identifier_finish (self, res, &error);
> + ctx = g_task_get_task_data (task);
> + simid = MM_BASE_SIM_GET_CLASS (self)->load_sim_identifier_finish (self, res, &error);
> if (!simid) {
> /* TODO: make the retries gobi-specific? */
>
> @@ -1366,7 +1355,7 @@ load_sim_identifier_ready (MMBaseSim *self,
> */
> if (++ctx->sim_identifier_tries < 2) {
> g_clear_error (&error);
> - interface_initialization_step (ctx);
> + interface_initialization_step (task);
> return;
> }
>
> @@ -1380,20 +1369,21 @@ load_sim_identifier_ready (MMBaseSim *self,
>
> /* Go on to next step */
> ctx->step++;
> - interface_initialization_step (ctx);
> + interface_initialization_step (task);
> }
>
> #undef STR_REPLY_READY_FN
> #define STR_REPLY_READY_FN(NAME,DISPLAY) \
> static void \
> - load_##NAME##_ready (MMBaseSim *self, \
> + load_##NAME##_ready (MMBaseSim *self, \
> GAsyncResult *res, \
> - InitAsyncContext *ctx) \
> + GTask *task) \
> { \
> + InitAsyncContext *ctx; \
> GError *error = NULL; \
> gchar *val; \
> \
> - val = MM_BASE_SIM_GET_CLASS (ctx->self)->load_##NAME##_finish (self, res, &error); \
> + val = MM_BASE_SIM_GET_CLASS (self)->load_##NAME##_finish (self, res, &error); \
> mm_gdbus_sim_set_##NAME (MM_GDBUS_SIM (self), val); \
> g_free (val); \
> \
> @@ -1403,8 +1393,9 @@ load_sim_identifier_ready (MMBaseSim *self,
> } \
> \
> /* Go on to next step */ \
> + ctx = g_task_get_task_data (task); \
> ctx->step++; \
> - interface_initialization_step (ctx); \
> + interface_initialization_step (task); \
> }
>
> STR_REPLY_READY_FN (imsi, "IMSI")
> @@ -1412,18 +1403,19 @@ STR_REPLY_READY_FN (operator_identifier, "Operator identifier")
> STR_REPLY_READY_FN (operator_name, "Operator name")
>
> static void
> -interface_initialization_step (InitAsyncContext *ctx)
> -{
> - if (g_cancellable_is_cancelled (ctx->cancellable)) {
> - g_simple_async_result_set_error (ctx->result,
> - MM_CORE_ERROR,
> - MM_CORE_ERROR_CANCELLED,
> - "Interface initialization cancelled");
> - g_simple_async_result_complete_in_idle (ctx->result);
> - init_async_context_free (ctx);
> +interface_initialization_step (GTask *task)
> +{
> + MMBaseSim *self;
> + InitAsyncContext *ctx;
> +
> + if (g_task_return_error_if_cancelled (task)) {
> + g_object_unref (task);
> return;
> }
>
> + self = g_task_get_source_object (task);
> + ctx = g_task_get_task_data (task);
> +
> switch (ctx->step) {
> case INITIALIZATION_STEP_FIRST:
> /* Fall down to next step */
> @@ -1433,13 +1425,13 @@ interface_initialization_step (InitAsyncContext *ctx)
> /* SIM ID is meant to be loaded only once during the whole
> * lifetime of the modem. Therefore, if we already have them loaded,
> * don't try to load them again. */
> - if (mm_gdbus_sim_get_sim_identifier (MM_GDBUS_SIM (ctx->self)) == NULL &&
> - MM_BASE_SIM_GET_CLASS (ctx->self)->load_sim_identifier &&
> - MM_BASE_SIM_GET_CLASS (ctx->self)->load_sim_identifier_finish) {
> - MM_BASE_SIM_GET_CLASS (ctx->self)->load_sim_identifier (
> - ctx->self,
> + if (mm_gdbus_sim_get_sim_identifier (MM_GDBUS_SIM (self)) == NULL &&
> + MM_BASE_SIM_GET_CLASS (self)->load_sim_identifier &&
> + MM_BASE_SIM_GET_CLASS (self)->load_sim_identifier_finish) {
> + MM_BASE_SIM_GET_CLASS (self)->load_sim_identifier (
> + self,
> (GAsyncReadyCallback)load_sim_identifier_ready,
> - ctx);
> + task);
> return;
> }
> /* Fall down to next step */
> @@ -1449,13 +1441,13 @@ interface_initialization_step (InitAsyncContext *ctx)
> /* IMSI is meant to be loaded only once during the whole
> * lifetime of the modem. Therefore, if we already have them loaded,
> * don't try to load them again. */
> - if (mm_gdbus_sim_get_imsi (MM_GDBUS_SIM (ctx->self)) == NULL &&
> - MM_BASE_SIM_GET_CLASS (ctx->self)->load_imsi &&
> - MM_BASE_SIM_GET_CLASS (ctx->self)->load_imsi_finish) {
> - MM_BASE_SIM_GET_CLASS (ctx->self)->load_imsi (
> - ctx->self,
> + if (mm_gdbus_sim_get_imsi (MM_GDBUS_SIM (self)) == NULL &&
> + MM_BASE_SIM_GET_CLASS (self)->load_imsi &&
> + MM_BASE_SIM_GET_CLASS (self)->load_imsi_finish) {
> + MM_BASE_SIM_GET_CLASS (self)->load_imsi (
> + self,
> (GAsyncReadyCallback)load_imsi_ready,
> - ctx);
> + task);
> return;
> }
> /* Fall down to next step */
> @@ -1465,13 +1457,13 @@ interface_initialization_step (InitAsyncContext *ctx)
> /* Operator ID is meant to be loaded only once during the whole
> * lifetime of the modem. Therefore, if we already have them loaded,
> * don't try to load them again. */
> - if (mm_gdbus_sim_get_operator_identifier (MM_GDBUS_SIM (ctx->self)) == NULL &&
> - MM_BASE_SIM_GET_CLASS (ctx->self)->load_operator_identifier &&
> - MM_BASE_SIM_GET_CLASS (ctx->self)->load_operator_identifier_finish) {
> - MM_BASE_SIM_GET_CLASS (ctx->self)->load_operator_identifier (
> - ctx->self,
> + if (mm_gdbus_sim_get_operator_identifier (MM_GDBUS_SIM (self)) == NULL &&
> + MM_BASE_SIM_GET_CLASS (self)->load_operator_identifier &&
> + MM_BASE_SIM_GET_CLASS (self)->load_operator_identifier_finish) {
> + MM_BASE_SIM_GET_CLASS (self)->load_operator_identifier (
> + self,
> (GAsyncReadyCallback)load_operator_identifier_ready,
> - ctx);
> + task);
> return;
> }
> /* Fall down to next step */
> @@ -1481,13 +1473,13 @@ interface_initialization_step (InitAsyncContext *ctx)
> /* Operator Name is meant to be loaded only once during the whole
> * lifetime of the modem. Therefore, if we already have them loaded,
> * don't try to load them again. */
> - if (mm_gdbus_sim_get_operator_name (MM_GDBUS_SIM (ctx->self)) == NULL &&
> - MM_BASE_SIM_GET_CLASS (ctx->self)->load_operator_name &&
> - MM_BASE_SIM_GET_CLASS (ctx->self)->load_operator_name_finish) {
> - MM_BASE_SIM_GET_CLASS (ctx->self)->load_operator_name (
> - ctx->self,
> + if (mm_gdbus_sim_get_operator_name (MM_GDBUS_SIM (self)) == NULL &&
> + MM_BASE_SIM_GET_CLASS (self)->load_operator_name &&
> + MM_BASE_SIM_GET_CLASS (self)->load_operator_name_finish) {
> + MM_BASE_SIM_GET_CLASS (self)->load_operator_name (
> + self,
> (GAsyncReadyCallback)load_operator_name_ready,
> - ctx);
> + task);
> return;
> }
> /* Fall down to next step */
> @@ -1495,13 +1487,11 @@ interface_initialization_step (InitAsyncContext *ctx)
>
> case INITIALIZATION_STEP_LAST:
> /* We are done without errors! */
> - g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
> - g_simple_async_result_complete_in_idle (ctx->result);
> - init_async_context_free (ctx);
> + g_task_return_boolean (task, TRUE);
> + g_object_unref (task);
> return;
> }
>
> -
> g_assert_not_reached ();
> }
>
> @@ -1512,21 +1502,20 @@ common_init_async (GAsyncInitable *initable,
> gpointer user_data)
>
> {
> + MMBaseSim *self;
> InitAsyncContext *ctx;
> + GTask *task;
> +
> + self = MM_BASE_SIM (initable);
>
> ctx = g_new (InitAsyncContext, 1);
> - ctx->self = g_object_ref (initable);
> - ctx->result = g_simple_async_result_new (G_OBJECT (initable),
> - callback,
> - user_data,
> - common_init_async);
> - ctx->cancellable = (cancellable ?
> - g_object_ref (cancellable) :
> - NULL);
> ctx->step = INITIALIZATION_STEP_FIRST;
> ctx->sim_identifier_tries = 0;
>
> - interface_initialization_step (ctx);
> + task = g_task_new (self, cancellable, callback, user_data);
> + g_task_set_task_data (task, ctx, g_free);
> +
> + interface_initialization_step (task);
> }
>
> static void
>
--
Aleksander
https://aleksander.es
More information about the ModemManager-devel
mailing list