base-modem: fix modem_sync() operation handling

The mm_base_modem_sync() method is an asynchronous method that
receives a callback and user data, and therefore we MUST always
complete the async method calling that callback. Set that up with a
GTask as usual.

Also, the mm_base_modem_sync_finish() method should be implemented
along with mm_base_modem_sync(), not in the source file of the
caller of the async method. The finish() always depends on how the
async method was implemented, in our case using a GTask.
This commit is contained in:
Aleksander Morgado
2021-05-23 12:19:06 +02:00
parent 6397aacfdb
commit 728e6cd398
2 changed files with 26 additions and 17 deletions

View File

@@ -729,13 +729,6 @@ mm_base_manager_num_modems (MMBaseManager *self)
#if defined WITH_SYSTEMD_SUSPEND_RESUME
gboolean mm_base_modem_sync_finish (MMBaseModem *self,
GAsyncResult *res,
GError **error)
{
return g_task_propagate_boolean (G_TASK (res), error);
}
static void
base_modem_sync_ready (MMBaseModem *self,
GAsyncResult *res,

View File

@@ -620,16 +620,26 @@ mm_base_modem_wait_link_port (MMBaseModem *self,
/******************************************************************************/
static void
mm_base_modem_sync_ready (MMBaseModem *self,
GAsyncResult *res)
gboolean
mm_base_modem_sync_finish (MMBaseModem *self,
GAsyncResult *res,
GError **error)
{
g_autoptr (GError) error = NULL;
return g_task_propagate_boolean (G_TASK (res), error);
}
MM_BASE_MODEM_GET_CLASS (self)->sync_finish (self, res, &error);
if (error) {
mm_obj_warn (self, "synchronization failed");
}
static void
sync_ready (MMBaseModem *self,
GAsyncResult *res,
GTask *task)
{
g_autoptr(GError) error = NULL;
if (!MM_BASE_MODEM_GET_CLASS (self)->sync_finish (self, res, &error))
g_task_return_error (task, error);
else
g_task_return_boolean (task, TRUE);
g_object_unref (task);
}
void
@@ -637,14 +647,20 @@ mm_base_modem_sync (MMBaseModem *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
GTask *task;
task = g_task_new (self, NULL, callback, user_data);
g_assert (MM_BASE_MODEM_GET_CLASS (self)->sync != NULL);
g_assert (MM_BASE_MODEM_GET_CLASS (self)->sync_finish != NULL);
MM_BASE_MODEM_GET_CLASS (self)->sync (self,
(GAsyncReadyCallback) mm_base_modem_sync_ready,
NULL);
(GAsyncReadyCallback) sync_ready,
task);
}
/******************************************************************************/
gboolean
mm_base_modem_disable_finish (MMBaseModem *self,
GAsyncResult *res,