[PATCH 4/4] iface-modem-time: port update_network_timezone to use GTask
Aleksander Morgado
aleksander at aleksander.es
Thu Jun 29 09:06:41 UTC 2017
On 29/06/17 06:44, Ben Chan wrote:
> ---
> src/mm-iface-modem-time.c | 120 +++++++++++++++++++++++-----------------------
> 1 file changed, 61 insertions(+), 59 deletions(-)
>
Pushed to git master, thanks.
> diff --git a/src/mm-iface-modem-time.c b/src/mm-iface-modem-time.c
> index eec340ed..41ca2f0e 100644
> --- a/src/mm-iface-modem-time.c
> +++ b/src/mm-iface-modem-time.c
> @@ -125,53 +125,46 @@ handle_get_network_time (MmGdbusModemTime *skeleton,
> /*****************************************************************************/
>
> typedef struct {
> - MMIfaceModemTime *self;
> - GSimpleAsyncResult *result;
> - GCancellable *cancellable;
> gulong cancelled_id;
> gulong state_changed_id;
> guint network_timezone_poll_id;
> guint network_timezone_poll_retries;
> } UpdateNetworkTimezoneContext;
>
> -static gboolean timezone_poll_cb (UpdateNetworkTimezoneContext *ctx);
> -
> -static void
> -update_network_timezone_context_complete_and_free (UpdateNetworkTimezoneContext *ctx)
> -{
> - g_simple_async_result_complete (ctx->result);
> - g_object_unref (ctx->result);
> - g_object_unref (ctx->cancellable);
> - g_object_unref (ctx->self);
> - g_free (ctx);
> -}
> +static gboolean timezone_poll_cb (GTask *task);
>
> static gboolean
> update_network_timezone_finish (MMIfaceModemTime *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);
> }
>
> static void
> cancelled (GCancellable *cancellable,
> - UpdateNetworkTimezoneContext *ctx)
> + GTask *task)
> {
> + MMIfaceModemTime *self;
> + UpdateNetworkTimezoneContext *ctx;
> +
> + self = g_task_get_source_object (task);
> + ctx = g_task_get_task_data (task);
> +
> /* If waiting to get registered, disconnect signal */
> if (ctx->state_changed_id)
> - g_signal_handler_disconnect (ctx->self,
> + g_signal_handler_disconnect (self,
> ctx->state_changed_id);
>
> /* If waiting in the timeout loop, remove the timeout */
> else if (ctx->network_timezone_poll_id)
> g_source_remove (ctx->network_timezone_poll_id);
>
> - g_simple_async_result_set_error (ctx->result,
> - MM_CORE_ERROR,
> - MM_CORE_ERROR_CANCELLED,
> - "Network timezone loading cancelled");
> - update_network_timezone_context_complete_and_free (ctx);
> + g_task_return_new_error (task,
> + MM_CORE_ERROR,
> + MM_CORE_ERROR_CANCELLED,
> + "Network timezone loading cancelled");
> + g_object_unref (task);
> }
>
> static void
> @@ -198,21 +191,19 @@ update_network_timezone_dictionary (MMIfaceModemTime *self,
> static void
> load_network_timezone_ready (MMIfaceModemTime *self,
> GAsyncResult *res,
> - UpdateNetworkTimezoneContext *ctx)
> + GTask *task)
> {
> + UpdateNetworkTimezoneContext *ctx;
> GError *error = NULL;
> MMNetworkTimezone *tz;
>
> - if (g_cancellable_is_cancelled (ctx->cancellable)) {
> - g_simple_async_result_set_error (ctx->result,
> - MM_CORE_ERROR,
> - MM_CORE_ERROR_CANCELLED,
> - "Finished network timezone loading, "
> - "but cancelled meanwhile");
> - update_network_timezone_context_complete_and_free (ctx);
> + if (g_task_return_error_if_cancelled (task)) {
> + g_object_unref (task);
> return;
> }
>
> + ctx = g_task_get_task_data (task);
> +
> /* Finish the async operation */
> tz = MM_IFACE_MODEM_TIME_GET_INTERFACE (self)->load_network_timezone_finish (self,
> res,
> @@ -226,69 +217,80 @@ load_network_timezone_ready (MMIfaceModemTime *self,
> !g_error_matches (error,
> MM_CORE_ERROR,
> MM_CORE_ERROR_RETRY)) {
> - g_simple_async_result_take_error (ctx->result, error);
> - update_network_timezone_context_complete_and_free (ctx);
> + g_task_return_error (task, error);
> + g_object_unref (task);
> return;
> }
>
> /* Otherwise, reconnect cancellable and relaunch timeout to query a bit
> * later */
> - ctx->cancelled_id = g_cancellable_connect (ctx->cancellable,
> + ctx->cancelled_id = g_cancellable_connect (g_task_get_cancellable (task),
> G_CALLBACK (cancelled),
> - ctx,
> + task,
> NULL);
> ctx->network_timezone_poll_id = g_timeout_add_seconds (TIMEZONE_POLL_INTERVAL_SEC,
> (GSourceFunc)timezone_poll_cb,
> - ctx);
> + task);
>
> g_error_free (error);
> return;
> }
>
> /* Got final result properly, update the property in the skeleton */
> - update_network_timezone_dictionary (ctx->self, tz);
> - g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
> - update_network_timezone_context_complete_and_free (ctx);
> + update_network_timezone_dictionary (self, tz);
> + g_task_return_boolean (task, TRUE);
> + g_object_unref (task);
> g_object_unref (tz);
> }
>
> static gboolean
> -timezone_poll_cb (UpdateNetworkTimezoneContext *ctx)
> +timezone_poll_cb (GTask *task)
> {
> + MMIfaceModemTime *self;
> + UpdateNetworkTimezoneContext *ctx;
> +
> + self = g_task_get_source_object (task);
> + ctx = g_task_get_task_data (task);
> +
> ctx->network_timezone_poll_id = 0;
>
> /* Before we launch the async loading of the network timezone,
> * we disconnect the cancellable signal. We don't want to get
> * signaled while waiting to finish this async method, we'll
> * check the cancellable afterwards instead. */
> - g_cancellable_disconnect (ctx->cancellable,
> + g_cancellable_disconnect (g_task_get_cancellable (task),
> ctx->cancelled_id);
> ctx->cancelled_id = 0;
>
> - MM_IFACE_MODEM_TIME_GET_INTERFACE (ctx->self)->load_network_timezone (
> - ctx->self,
> + MM_IFACE_MODEM_TIME_GET_INTERFACE (self)->load_network_timezone (
> + self,
> (GAsyncReadyCallback)load_network_timezone_ready,
> - ctx);
> + task);
>
> return G_SOURCE_REMOVE;
> }
>
> static void
> -start_timezone_poll (UpdateNetworkTimezoneContext *ctx)
> +start_timezone_poll (GTask *task)
> {
> + UpdateNetworkTimezoneContext *ctx;
> +
> + ctx = g_task_get_task_data (task);
> +
> /* Setup loop to query current timezone, don't do it right away.
> * Note that we're passing the context reference to the loop. */
> ctx->network_timezone_poll_retries = TIMEZONE_POLL_RETRIES;
> ctx->network_timezone_poll_id = g_timeout_add_seconds (TIMEZONE_POLL_INTERVAL_SEC,
> (GSourceFunc)timezone_poll_cb,
> - ctx);
> + task);
> }
>
> static void
> state_changed (MMIfaceModemTime *self,
> GParamSpec *spec,
> - UpdateNetworkTimezoneContext *ctx)
> + GTask *task)
> {
> + UpdateNetworkTimezoneContext *ctx;
> MMModemState state = MM_MODEM_STATE_UNKNOWN;
>
> g_object_get (self,
> @@ -299,6 +301,8 @@ state_changed (MMIfaceModemTime *self,
> if (state < MM_MODEM_STATE_REGISTERED)
> return;
>
> + ctx = g_task_get_task_data (task);
> +
> /* Got registered, disconnect signal */
> if (ctx->state_changed_id) {
> g_signal_handler_disconnect (self,
> @@ -307,7 +311,7 @@ state_changed (MMIfaceModemTime *self,
> }
>
> /* Once we know we're registered, start timezone poll */
> - start_timezone_poll (ctx);
> + start_timezone_poll (task);
> }
>
> static void
> @@ -316,8 +320,9 @@ update_network_timezone (MMIfaceModemTime *self,
> GAsyncReadyCallback callback,
> gpointer user_data)
> {
> - UpdateNetworkTimezoneContext *ctx;
> MMModemState state = MM_MODEM_STATE_UNKNOWN;
> + UpdateNetworkTimezoneContext *ctx;
> + GTask *task;
>
> /* If loading network timezone not supported, just finish here */
> if (!MM_IFACE_MODEM_TIME_GET_INTERFACE (self)->load_network_timezone ||
> @@ -332,19 +337,16 @@ update_network_timezone (MMIfaceModemTime *self,
> }
>
> ctx = g_new0 (UpdateNetworkTimezoneContext, 1);
> - ctx->self = g_object_ref (self);
> - ctx->cancellable = g_object_ref (cancellable);
> - ctx->result = g_simple_async_result_new (G_OBJECT (self),
> - callback,
> - user_data,
> - update_network_timezone);
> +
> + task = g_task_new (self, cancellable, callback, user_data);
> + g_task_set_task_data (task, ctx, g_free);
>
> /* Note: we don't expect to get cancelled by any other thread, so no
> * need to check if we're cancelled just after connecting to the
> * cancelled signal */
> - ctx->cancelled_id = g_cancellable_connect (ctx->cancellable,
> + ctx->cancelled_id = g_cancellable_connect (cancellable,
> G_CALLBACK (cancelled),
> - ctx,
> + task,
> NULL);
>
> g_object_get (self,
> @@ -354,13 +356,13 @@ update_network_timezone (MMIfaceModemTime *self,
> /* Already registered? */
> if (state >= MM_MODEM_STATE_REGISTERED) {
> /* Once we know we're registered, start timezone poll */
> - start_timezone_poll (ctx);
> + start_timezone_poll (task);
> } else {
> /* Want to get notified when modem state changes */
> - ctx->state_changed_id = g_signal_connect (ctx->self,
> + ctx->state_changed_id = g_signal_connect (self,
> "notify::" MM_IFACE_MODEM_STATE,
> G_CALLBACK (state_changed),
> - ctx);
> + task);
> }
> }
>
>
--
Aleksander
https://aleksander.es
More information about the ModemManager-devel
mailing list