aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Chan <benchan@chromium.org>2017-04-19 10:43:06 -0700
committerAleksander Morgado <aleksander@aleksander.es>2017-04-19 20:11:24 +0200
commit907cc6a96b43bacb20e36f7ec6597a6210a00367 (patch)
tree0a96c46fdbd25bec43164508564a88be2934d7e8
parentd1b5a4971cea6fbcdc7ac7c3606f630314564072 (diff)
downloadexternal_libqmi-907cc6a96b43bacb20e36f7ec6597a6210a00367.zip
external_libqmi-907cc6a96b43bacb20e36f7ec6597a6210a00367.tar.gz
external_libqmi-907cc6a96b43bacb20e36f7ec6597a6210a00367.tar.bz2
qmicli,dms: port get_stored_image to use GTask
The updated code also avoids a potential memory leak of GetStoredImageContext in get_stored_image_list_stored_images_ready when the operation fails.
-rw-r--r--src/qmicli/qmicli-dms.c71
1 files changed, 46 insertions, 25 deletions
diff --git a/src/qmicli/qmicli-dms.c b/src/qmicli/qmicli-dms.c
index 224782c..b249752 100644
--- a/src/qmicli/qmicli-dms.c
+++ b/src/qmicli/qmicli-dms.c
@@ -2649,8 +2649,6 @@ list_stored_images_ready (QmiClientDms *client,
}
typedef struct {
- QmiClientDms *client;
- GSimpleAsyncResult *result;
gint modem_index;
gint pri_index;
} GetStoredImageContext;
@@ -2663,15 +2661,24 @@ typedef struct {
} GetStoredImageResult;
static void
-get_stored_image_context_complete_and_free (GetStoredImageContext *operation_ctx)
+get_stored_image_context_free (GetStoredImageContext *operation_ctx)
{
- g_simple_async_result_complete (operation_ctx->result);
- g_object_unref (operation_ctx->result);
- g_object_unref (operation_ctx->client);
g_slice_free (GetStoredImageContext, operation_ctx);
}
static void
+get_stored_image_result_free (GetStoredImageResult *result)
+{
+ if (result) {
+ g_clear_pointer (&result->modem_unique_id, (GDestroyNotify)g_array_unref);
+ g_free (result->modem_build_id);
+ g_clear_pointer (&result->pri_unique_id, (GDestroyNotify)g_array_unref);
+ g_free (result->pri_build_id);
+ g_slice_free (GetStoredImageResult, result);
+ }
+}
+
+static void
get_stored_image_finish (QmiClientDms *client,
GAsyncResult *res,
GArray **modem_unique_id,
@@ -2680,21 +2687,30 @@ get_stored_image_finish (QmiClientDms *client,
gchar **pri_build_id)
{
GetStoredImageResult *result;
+ GError *error = NULL;
- result = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res));
+ result = g_task_propagate_pointer (G_TASK (res), &error);
- *modem_unique_id = result->modem_unique_id ? g_array_ref (result->modem_unique_id) : NULL;
- *modem_build_id = g_strdup (result->modem_build_id);
- *pri_unique_id = result->pri_unique_id ? g_array_ref (result->pri_unique_id) : NULL;
- *pri_build_id = g_strdup (result->pri_build_id);
+ /* The operation always returns a result */
+ g_assert (result);
+ g_assert_no_error (error);
+
+ /* Simply pass ownership to caller */
+ *modem_unique_id = result->modem_unique_id;
+ *modem_build_id = result->modem_build_id;
+ *pri_unique_id = result->pri_unique_id;
+ *pri_build_id = result->pri_build_id;
+
+ g_slice_free (GetStoredImageResult, result);
}
static void
get_stored_image_list_stored_images_ready (QmiClientDms *client,
GAsyncResult *res,
- GetStoredImageContext *operation_ctx)
+ GTask *task)
{
- GetStoredImageResult result = { NULL, NULL, NULL, NULL };
+ GetStoredImageContext *operation_ctx;
+ GetStoredImageResult *result;
GArray *array;
QmiMessageDmsListStoredImagesOutput *output;
GError *error = NULL;
@@ -2704,6 +2720,7 @@ get_stored_image_list_stored_images_ready (QmiClientDms *client,
if (!output) {
g_printerr ("error: operation failed: %s\n", error->message);
g_error_free (error);
+ g_object_unref (task);
operation_shutdown (FALSE);
return;
}
@@ -2712,6 +2729,7 @@ get_stored_image_list_stored_images_ready (QmiClientDms *client,
g_printerr ("error: couldn't list stored images: %s\n", error->message);
g_error_free (error);
qmi_message_dms_list_stored_images_output_unref (output);
+ g_object_unref (task);
operation_shutdown (FALSE);
return;
}
@@ -2721,6 +2739,8 @@ get_stored_image_list_stored_images_ready (QmiClientDms *client,
&array,
NULL);
+ operation_ctx = g_task_get_task_data (task);
+
for (i = 0; i < array->len; i++) {
QmiMessageDmsListStoredImagesOutputListImageSublistSublistElement *subimage;
QmiMessageDmsListStoredImagesOutputListImage *image;
@@ -2747,6 +2767,7 @@ get_stored_image_list_stored_images_ready (QmiClientDms *client,
qmi_dms_firmware_image_type_get_string (image->type),
image_index);
qmi_message_dms_list_stored_images_output_unref (output);
+ g_object_unref (task);
operation_shutdown (FALSE);
return;
}
@@ -2764,19 +2785,20 @@ get_stored_image_list_stored_images_ready (QmiClientDms *client,
g_free (unique_id_str);
/* Build result */
+ result = g_slice_new0 (GetStoredImageResult);
if (image->type == QMI_DMS_FIRMWARE_IMAGE_TYPE_MODEM) {
- result.modem_unique_id = subimage->unique_id;
- result.modem_build_id = subimage->build_id;
+ result->modem_unique_id = subimage->unique_id ? g_array_ref (subimage->unique_id) : NULL;
+ result->modem_build_id = g_strdup (subimage->build_id);
} else if (image->type == QMI_DMS_FIRMWARE_IMAGE_TYPE_PRI) {
- result.pri_unique_id = subimage->unique_id;
- result.pri_build_id = subimage->build_id;
+ result->pri_unique_id = subimage->unique_id ? g_array_ref (subimage->unique_id) : NULL;
+ result->pri_build_id = g_strdup (subimage->build_id);
} else
g_assert_not_reached ();
}
/* Complete */
- g_simple_async_result_set_op_res_gpointer (operation_ctx->result, &result, NULL);
- get_stored_image_context_complete_and_free (operation_ctx);
+ g_task_return_pointer (task, result, (GDestroyNotify)get_stored_image_result_free);
+ g_object_unref (task);
qmi_message_dms_list_stored_images_output_unref (output);
}
@@ -2787,6 +2809,7 @@ get_stored_image (QmiClientDms *client,
gpointer user_data)
{
GetStoredImageContext *operation_ctx;
+ GTask *task;
gchar **split;
guint i = 0;
gint modem_index = -1;
@@ -2829,21 +2852,19 @@ get_stored_image (QmiClientDms *client,
}
operation_ctx = g_slice_new (GetStoredImageContext);
- operation_ctx->client = g_object_ref (client);
- operation_ctx->result = g_simple_async_result_new (G_OBJECT (client),
- callback,
- user_data,
- get_stored_image);
operation_ctx->modem_index = modem_index;
operation_ctx->pri_index = pri_index;
+ task = g_task_new (client, NULL, callback, user_data);
+ g_task_set_task_data (task, operation_ctx, (GDestroyNotify)get_stored_image_context_free);
+
qmi_client_dms_list_stored_images (
ctx->client,
NULL,
10,
ctx->cancellable,
(GAsyncReadyCallback)get_stored_image_list_stored_images_ready,
- operation_ctx);
+ task);
}
/* Note: