aboutsummaryrefslogtreecommitdiff
path: root/src/mm-base-manager.c
diff options
context:
space:
mode:
authorDylan Van Assche <me@dylanvanassche.be>2021-05-01 15:50:47 +0200
committerAleksander Morgado <aleksander@aleksander.es>2021-05-26 13:14:52 +0000
commit38740e9d11a52f91e41349a62caf35f8e1a67f48 (patch)
treed1c1514d9cf98790a44e1e156ce71adc8922cd0b /src/mm-base-manager.c
parent940063419a1c2eb9f6e197d60b4c7cb42702de8d (diff)
base-manager: add quick suspend/resume base
Quick suspend/resume infrastructure for synchronizing the interfaces when resuming.
Diffstat (limited to 'src/mm-base-manager.c')
-rw-r--r--src/mm-base-manager.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/mm-base-manager.c b/src/mm-base-manager.c
index 24812932..e7df890a 100644
--- a/src/mm-base-manager.c
+++ b/src/mm-base-manager.c
@@ -52,6 +52,7 @@
#include "mm-plugin.h"
#include "mm-filter.h"
#include "mm-log-object.h"
+#include "mm-base-modem.h"
static void initable_iface_init (GInitableIface *iface);
static void log_object_iface_init (MMLogObjectInterface *iface);
@@ -724,6 +725,53 @@ mm_base_manager_num_modems (MMBaseManager *self)
}
/*****************************************************************************/
+/* Quick resume synchronization */
+
+#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
+mm_base_modem_sync_ready (MMBaseModem *self,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ g_autoptr(GError) error;
+
+ mm_base_modem_sync_finish (self, res, &error);
+ if (error) {
+ mm_obj_warn (self, "synchronization failed");
+ return;
+ }
+ mm_obj_info (self, "synchronization finished");
+}
+
+void
+mm_base_manager_sync (MMBaseManager *self)
+{
+ GHashTableIter iter;
+ gpointer key, value;
+
+ g_return_if_fail (self != NULL);
+ g_return_if_fail (MM_IS_BASE_MANAGER (self));
+
+ /* Refresh each device */
+ g_hash_table_iter_init (&iter, self->priv->devices);
+ while (g_hash_table_iter_next (&iter, &key, &value)) {
+ MMBaseModem *modem = mm_device_peek_modem (MM_DEVICE (value));
+ /* We just want to start the synchronization, we don't need the result */
+ mm_base_modem_sync (modem, (GAsyncReadyCallback)mm_base_modem_sync_ready, NULL);
+ }
+}
+
+#endif
+
+/*****************************************************************************/
/* Set logging */
typedef struct {