[PATCH 5/8] libqmi-glib,device: port qmi_device_allocate_client to use GTask
Aleksander Morgado
aleksander at aleksander.es
Tue Apr 18 13:42:53 UTC 2017
On 12/04/17 22:15, Ben Chan wrote:
> ---
> src/libqmi-glib/qmi-device.c | 115 +++++++++++++++++++++----------------------
> 1 file changed, 57 insertions(+), 58 deletions(-)
>
Pushed to git master, thanks.
> diff --git a/src/libqmi-glib/qmi-device.c b/src/libqmi-glib/qmi-device.c
> index 465336f..108b605 100644
> --- a/src/libqmi-glib/qmi-device.c
> +++ b/src/libqmi-glib/qmi-device.c
> @@ -858,19 +858,14 @@ unregister_client (QmiDevice *self,
> /* Allocate new client */
>
> typedef struct {
> - QmiDevice *self;
> - GSimpleAsyncResult *result;
> QmiService service;
> GType client_type;
> guint8 cid;
> } AllocateClientContext;
>
> static void
> -allocate_client_context_complete_and_free (AllocateClientContext *ctx)
> +allocate_client_context_free (AllocateClientContext *ctx)
> {
> - g_simple_async_result_complete_in_idle (ctx->result);
> - g_object_unref (ctx->result);
> - g_object_unref (ctx->self);
> g_slice_free (AllocateClientContext, ctx);
> }
>
> @@ -879,30 +874,32 @@ qmi_device_allocate_client_finish (QmiDevice *self,
> GAsyncResult *res,
> GError **error)
> {
> - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error))
> - return NULL;
> -
> - return QMI_CLIENT (g_object_ref (g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res))));
> + return g_task_propagate_pointer (G_TASK (res), error);
> }
>
> static void
> -build_client_object (AllocateClientContext *ctx)
> +build_client_object (GTask *task)
> {
> + QmiDevice *self;
> + AllocateClientContext *ctx;
> gchar *version_string = NULL;
> QmiClient *client;
> GError *error = NULL;
> const QmiMessageCtlGetVersionInfoOutputServiceListService *version_info;
>
> + self = g_task_get_source_object (task);
> + ctx = g_task_get_task_data (task);
> +
> /* We now have a proper CID for the client, we should be able to create it
> * right away */
> client = g_object_new (ctx->client_type,
> - QMI_CLIENT_DEVICE, ctx->self,
> + QMI_CLIENT_DEVICE, self,
> QMI_CLIENT_SERVICE, ctx->service,
> QMI_CLIENT_CID, ctx->cid,
> NULL);
>
> /* Add version info to the client if it was retrieved */
> - version_info = find_service_version_info (ctx->self, ctx->service);
> + version_info = find_service_version_info (self, ctx->service);
> if (version_info)
> g_object_set (client,
> QMI_CLIENT_VERSION_MAJOR, version_info->major_version,
> @@ -910,28 +907,28 @@ build_client_object (AllocateClientContext *ctx)
> NULL);
>
> /* Register the client to get indications */
> - if (!register_client (ctx->self, client, &error)) {
> + if (!register_client (self, client, &error)) {
> g_prefix_error (&error,
> "Cannot register new client with CID '%u' and service '%s'",
> ctx->cid,
> qmi_service_get_string (ctx->service));
> - g_simple_async_result_take_error (ctx->result, error);
> - allocate_client_context_complete_and_free (ctx);
> + g_task_return_error (task, error);
> + g_object_unref (task);
> g_object_unref (client);
> return;
> }
>
> /* Build version string for the logging */
> - if (ctx->self->priv->supported_services) {
> + if (self->priv->supported_services) {
> const QmiMessageCtlGetVersionInfoOutputServiceListService *info;
>
> - info = find_service_version_info (ctx->self, ctx->service);
> + info = find_service_version_info (self, ctx->service);
> if (info)
> version_string = g_strdup_printf ("%u.%u", info->major_version, info->minor_version);
> }
>
> g_debug ("[%s] Registered '%s' (version %s) client with ID '%u'",
> - ctx->self->priv->path_display,
> + self->priv->path_display,
> qmi_service_get_string (ctx->service),
> version_string ? version_string : "unknown",
> ctx->cid);
> @@ -939,35 +936,34 @@ build_client_object (AllocateClientContext *ctx)
> g_free (version_string);
>
> /* Client created and registered, complete successfully */
> - g_simple_async_result_set_op_res_gpointer (ctx->result,
> - client,
> - g_object_unref);
> - allocate_client_context_complete_and_free (ctx);
> + g_task_return_pointer (task, client, g_object_unref);
> + g_object_unref (task);
> }
>
> static void
> allocate_cid_ready (QmiClientCtl *client_ctl,
> GAsyncResult *res,
> - AllocateClientContext *ctx)
> + GTask *task)
> {
> QmiMessageCtlAllocateCidOutput *output;
> QmiService service;
> guint8 cid;
> GError *error = NULL;
> + AllocateClientContext *ctx;
>
> /* Check result of the async operation */
> output = qmi_client_ctl_allocate_cid_finish (client_ctl, res, &error);
> if (!output) {
> g_prefix_error (&error, "CID allocation failed in the CTL client: ");
> - g_simple_async_result_take_error (ctx->result, error);
> - allocate_client_context_complete_and_free (ctx);
> + g_task_return_error (task, error);
> + g_object_unref (task);
> return;
> }
>
> /* Check result of the QMI operation */
> if (!qmi_message_ctl_allocate_cid_output_get_result (output, &error)) {
> - g_simple_async_result_take_error (ctx->result, error);
> - allocate_client_context_complete_and_free (ctx);
> + g_task_return_error (task, error);
> + g_object_unref (task);
> qmi_message_ctl_allocate_cid_output_unref (output);
> return;
> }
> @@ -975,22 +971,24 @@ allocate_cid_ready (QmiClientCtl *client_ctl,
> /* Allocation info is mandatory when result is success */
> g_assert (qmi_message_ctl_allocate_cid_output_get_allocation_info (output, &service, &cid, NULL));
>
> + ctx = g_task_get_task_data (task);
> +
> if (service != ctx->service) {
> - g_simple_async_result_set_error (
> - ctx->result,
> + g_task_return_new_error (
> + task,
> QMI_CORE_ERROR,
> QMI_CORE_ERROR_FAILED,
> "CID allocation failed in the CTL client: "
> "Service mismatch (requested '%s', got '%s')",
> qmi_service_get_string (ctx->service),
> qmi_service_get_string (service));
> - allocate_client_context_complete_and_free (ctx);
> + g_object_unref (task);
> qmi_message_ctl_allocate_cid_output_unref (output);
> return;
> }
>
> ctx->cid = cid;
> - build_client_object (ctx);
> + build_client_object (task);
> qmi_message_ctl_allocate_cid_output_unref (output);
> }
>
> @@ -1004,36 +1002,37 @@ qmi_device_allocate_client (QmiDevice *self,
> gpointer user_data)
> {
> AllocateClientContext *ctx;
> + GTask *task;
>
> g_return_if_fail (QMI_IS_DEVICE (self));
> g_return_if_fail (service != QMI_SERVICE_UNKNOWN);
>
> ctx = g_slice_new0 (AllocateClientContext);
> - ctx->self = g_object_ref (self);
> - ctx->result = g_simple_async_result_new (G_OBJECT (self),
> - callback,
> - user_data,
> - qmi_device_allocate_client);
> ctx->service = service;
>
> + task = g_task_new (self, cancellable, callback, user_data);
> + g_task_set_task_data (task,
> + ctx,
> + (GDestroyNotify)allocate_client_context_free);
> +
> /* Check if the requested service is supported by the device */
> if (!check_service_supported (self, service)) {
> - g_simple_async_result_set_error (ctx->result,
> - QMI_CORE_ERROR,
> - QMI_CORE_ERROR_UNSUPPORTED,
> - "Service '%s' not supported by the device",
> - qmi_service_get_string (service));
> - allocate_client_context_complete_and_free (ctx);
> + g_task_return_new_error (task,
> + QMI_CORE_ERROR,
> + QMI_CORE_ERROR_UNSUPPORTED,
> + "Service '%s' not supported by the device",
> + qmi_service_get_string (service));
> + g_object_unref (task);
> return;
> }
>
> switch (service) {
> case QMI_SERVICE_CTL:
> - g_simple_async_result_set_error (ctx->result,
> - QMI_CORE_ERROR,
> - QMI_CORE_ERROR_INVALID_ARGS,
> - "Cannot create additional clients for the CTL service");
> - allocate_client_context_complete_and_free (ctx);
> + g_task_return_new_error (task,
> + QMI_CORE_ERROR,
> + QMI_CORE_ERROR_INVALID_ARGS,
> + "Cannot create additional clients for the CTL service");
> + g_object_unref (task);
> return;
>
> case QMI_SERVICE_DMS:
> @@ -1081,12 +1080,12 @@ qmi_device_allocate_client (QmiDevice *self,
> break;
>
> default:
> - g_simple_async_result_set_error (ctx->result,
> - QMI_CORE_ERROR,
> - QMI_CORE_ERROR_INVALID_ARGS,
> - "Clients for service '%s' not yet supported",
> - qmi_service_get_string (service));
> - allocate_client_context_complete_and_free (ctx);
> + g_task_return_new_error (task,
> + QMI_CORE_ERROR,
> + QMI_CORE_ERROR_INVALID_ARGS,
> + "Clients for service '%s' not yet supported",
> + qmi_service_get_string (service));
> + g_object_unref (task);
> return;
> }
>
> @@ -1098,13 +1097,13 @@ qmi_device_allocate_client (QmiDevice *self,
> qmi_message_ctl_allocate_cid_input_set_service (input, ctx->service, NULL);
>
> g_debug ("[%s] Allocating new client ID...",
> - ctx->self->priv->path_display);
> + self->priv->path_display);
> qmi_client_ctl_allocate_cid (self->priv->client_ctl,
> input,
> timeout,
> cancellable,
> (GAsyncReadyCallback)allocate_cid_ready,
> - ctx);
> + task);
>
> qmi_message_ctl_allocate_cid_input_unref (input);
> return;
> @@ -1112,10 +1111,10 @@ qmi_device_allocate_client (QmiDevice *self,
>
> /* Reuse the given CID */
> g_debug ("[%s] Reusing client CID '%u'...",
> - ctx->self->priv->path_display,
> + self->priv->path_display,
> cid);
> ctx->cid = cid;
> - build_client_object (ctx);
> + build_client_object (task);
> }
>
> /*****************************************************************************/
>
--
Aleksander
https://aleksander.es
More information about the libqmi-devel
mailing list