[PATCH 3/3] bearer-qmi: port reload_stats to use GTask
Aleksander Morgado
aleksander at aleksander.es
Mon Jul 3 08:39:30 UTC 2017
On 01/07/17 09:16, Ben Chan wrote:
> ---
> src/mm-bearer-qmi.c | 68 ++++++++++++++++++++++++++++++-----------------------
> 1 file changed, 38 insertions(+), 30 deletions(-)
>
Pushed to git master, thanks.
> diff --git a/src/mm-bearer-qmi.c b/src/mm-bearer-qmi.c
> index e0c8e177..4d532274 100644
> --- a/src/mm-bearer-qmi.c
> +++ b/src/mm-bearer-qmi.c
> @@ -69,8 +69,6 @@ typedef struct {
> } ReloadStatsResult;
>
> typedef struct {
> - MMBearerQmi *self;
> - GSimpleAsyncResult *result;
> QmiMessageWdsGetPacketStatisticsInput *input;
> ReloadStatsContextStep step;
> ReloadStatsResult stats;
> @@ -85,52 +83,54 @@ reload_stats_finish (MMBaseBearer *bearer,
> {
> ReloadStatsResult *stats;
>
> - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error))
> + stats = g_task_propagate_pointer (G_TASK (res), error);
> + if (!stats)
> return FALSE;
>
> - stats = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res));
> if (rx_bytes)
> *rx_bytes = stats->rx_bytes;
> if (tx_bytes)
> *tx_bytes = stats->tx_bytes;
> +
> + g_free (stats);
> return TRUE;
> }
>
> static void
> -reload_stats_context_complete_and_free (ReloadStatsContext *ctx)
> +reload_stats_context_free (ReloadStatsContext *ctx)
> {
> - g_simple_async_result_complete (ctx->result);
> - g_object_unref (ctx->result);
> - g_object_unref (ctx->self);
> qmi_message_wds_get_packet_statistics_input_unref (ctx->input);
> g_slice_free (ReloadStatsContext, ctx);
> }
>
> -static void reload_stats_context_step (ReloadStatsContext *ctx);
> +static void reload_stats_context_step (GTask *task);
>
> static void
> get_packet_statistics_ready (QmiClientWds *client,
> GAsyncResult *res,
> - ReloadStatsContext *ctx)
> + GTask *task)
> {
> + ReloadStatsContext *ctx;
> GError *error = NULL;
> QmiMessageWdsGetPacketStatisticsOutput *output;
> guint64 tx_bytes_ok = 0;
> guint64 rx_bytes_ok = 0;
>
> + ctx = g_task_get_task_data (task);
> +
> output = qmi_client_wds_get_packet_statistics_finish (client, res, &error);
> if (!output) {
> g_prefix_error (&error, "QMI operation failed: ");
> - g_simple_async_result_take_error (ctx->result, error);
> - reload_stats_context_complete_and_free (ctx);
> + g_task_return_error (task, error);
> + g_object_unref (task);
> return;
> }
>
> if (!qmi_message_wds_get_packet_statistics_output_get_result (output, &error)) {
> g_prefix_error (&error, "Couldn't get packet statistics: ");
> - g_simple_async_result_take_error (ctx->result, error);
> + g_task_return_error (task, error);
> + g_object_unref (task);
> qmi_message_wds_get_packet_statistics_output_unref (output);
> - reload_stats_context_complete_and_free (ctx);
> return;
> }
>
> @@ -143,43 +143,52 @@ get_packet_statistics_ready (QmiClientWds *client,
>
> /* Go on */
> ctx->step++;
> - reload_stats_context_step (ctx);
> + reload_stats_context_step (task);
> }
>
> static void
> -reload_stats_context_step (ReloadStatsContext *ctx)
> +reload_stats_context_step (GTask *task)
> {
> + MMBearerQmi *self;
> + ReloadStatsContext *ctx;
> + ReloadStatsResult *stats;
> +
> + self = g_task_get_source_object (task);
> + ctx = g_task_get_task_data (task);
> +
> switch (ctx->step) {
> case RELOAD_STATS_CONTEXT_STEP_FIRST:
> /* Fall through */
> ctx->step++;
> case RELOAD_STATS_CONTEXT_STEP_IPV4:
> - if (ctx->self->priv->client_ipv4) {
> - qmi_client_wds_get_packet_statistics (QMI_CLIENT_WDS (ctx->self->priv->client_ipv4),
> + if (self->priv->client_ipv4) {
> + qmi_client_wds_get_packet_statistics (QMI_CLIENT_WDS (self->priv->client_ipv4),
> ctx->input,
> 10,
> NULL,
> (GAsyncReadyCallback)get_packet_statistics_ready,
> - ctx);
> + task);
> return;
> }
> ctx->step++;
> /* Fall through */
> case RELOAD_STATS_CONTEXT_STEP_IPV6:
> - if (ctx->self->priv->client_ipv6) {
> - qmi_client_wds_get_packet_statistics (QMI_CLIENT_WDS (ctx->self->priv->client_ipv6),
> + if (self->priv->client_ipv6) {
> + qmi_client_wds_get_packet_statistics (QMI_CLIENT_WDS (self->priv->client_ipv6),
> ctx->input,
> 10,
> NULL,
> (GAsyncReadyCallback)get_packet_statistics_ready,
> - ctx);
> + task);
> return;
> }
> ctx->step++;
> /* Fall through */
> case RELOAD_STATS_CONTEXT_STEP_LAST:
> - g_simple_async_result_set_op_res_gpointer (ctx->result, &ctx->stats, NULL);
> - reload_stats_context_complete_and_free (ctx);
> + stats = g_new (ReloadStatsResult, 1);
> + memcpy (stats, &ctx->stats, sizeof (ctx->stats));
> + g_task_return_pointer (task, stats, g_free);
> + g_object_unref (task);
> return;
> }
> }
> @@ -190,13 +199,9 @@ reload_stats (MMBaseBearer *self,
> gpointer user_data)
> {
> ReloadStatsContext *ctx;
> + GTask *task;
>
> ctx = g_slice_new0 (ReloadStatsContext);
> - ctx->self = g_object_ref (self);
> - ctx->result = g_simple_async_result_new (G_OBJECT (self),
> - callback,
> - user_data,
> - reload_stats);
> ctx->input = qmi_message_wds_get_packet_statistics_input_new ();
> qmi_message_wds_get_packet_statistics_input_set_mask (
> ctx->input,
> @@ -205,7 +210,10 @@ reload_stats (MMBaseBearer *self,
> NULL);
> ctx->step = RELOAD_STATS_CONTEXT_STEP_FIRST;
>
> - reload_stats_context_step (ctx);
> + task = g_task_new (self, NULL, callback, user_data);
> + g_task_set_task_data (task, ctx, (GDestroyNotify)reload_stats_context_free);
> +
> + reload_stats_context_step (task);
> }
>
> /*****************************************************************************/
>
--
Aleksander
https://aleksander.es
More information about the ModemManager-devel
mailing list