diff options
author | Dan Williams <dan@ioncontrol.co> | 2025-03-08 14:25:04 -0600 |
---|---|---|
committer | Dan Williams <dan@ioncontrol.co> | 2025-05-07 22:59:51 -0500 |
commit | f4cbca56d5cea3ac865e6f113712752a98df2509 (patch) | |
tree | 6e777d920734a6e7815227aafc2a9c9b90891970 /src/mm-sleep-monitor-powerd.c | |
parent | 6350b0a85f76e830b3749933c4ee7e926c8686ad (diff) |
base-manager,sleep-monitor: wait for modem operations before sleeping
Signed-off-by: Dan Williams <dan@ioncontrol.co>
Diffstat (limited to 'src/mm-sleep-monitor-powerd.c')
-rw-r--r-- | src/mm-sleep-monitor-powerd.c | 66 |
1 files changed, 49 insertions, 17 deletions
diff --git a/src/mm-sleep-monitor-powerd.c b/src/mm-sleep-monitor-powerd.c index 093b9deb..cdc08cf3 100644 --- a/src/mm-sleep-monitor-powerd.c +++ b/src/mm-sleep-monitor-powerd.c @@ -29,6 +29,7 @@ #include "mm-log-object.h" #include "mm-utils.h" #include "mm-sleep-monitor.h" +#include "mm-sleep-context.h" #define PD_NAME "org.chromium.PowerManager" #define PD_PATH "/org/chromium/PowerManager" @@ -37,13 +38,15 @@ struct _MMSleepMonitor { GObject parent_instance; - GDBusProxy *pd_proxy; + GDBusProxy *pd_proxy; + MMSleepContext *sleep_ctx; + guint sleep_done_id; }; struct _MMSleepMonitorClass { GObjectClass parent_class; - void (*sleeping) (MMSleepMonitor *monitor); + void (*sleeping) (MMSleepMonitor *monitor, MMSleepContext *ctx); void (*resuming) (MMSleepMonitor *monitor); }; @@ -71,6 +74,26 @@ log_object_build_id (MMLogObject *_self) /********************************************************************/ static void +cleanup_sleep_context (MMSleepMonitor *self) +{ + if (self->sleep_ctx && self->sleep_done_id) + g_signal_handler_disconnect (self->sleep_ctx, self->sleep_done_id); + self->sleep_done_id = 0; + g_clear_object (&self->sleep_ctx); +} + +static void +sleep_context_done (MMSleepContext *sleep_ctx, + GError *error, + MMSleepMonitor *self) +{ + if (error) + mm_obj_warn (self, "sleep context failed: %s", error->message); + mm_obj_msg (self, "ready to sleep"); + cleanup_sleep_context (self); +} + +static void signal_cb (GDBusProxy *proxy, const gchar *sendername, const gchar *signalname, @@ -79,14 +102,24 @@ signal_cb (GDBusProxy *proxy, { MMSleepMonitor *self = data; - if (proxy == self->pd_proxy) { - if (strcmp (signalname, "SuspendImminent") == 0) { - mm_obj_msg (self, "system suspend signal from powerd"); - g_signal_emit (self, signals[SLEEPING], 0); - } else if (strcmp (signalname, "SuspendDone") == 0) { - mm_obj_msg (self, "system resume signal from powerd"); - g_signal_emit (self, signals[RESUMING], 0); + if (proxy != self->pd_proxy) + return; + + if (strcmp (signalname, "SuspendImminent") == 0) { + if (self->sleep_ctx || self->sleep_done_id) { + mm_obj_warn (self, "clearing unfinished sleep context..."); + cleanup_sleep_context (self); } + self->sleep_ctx = mm_sleep_context_new (5); + self->sleep_done_id = g_signal_connect (self->sleep_ctx, + MM_SLEEP_CONTEXT_DONE, + (GCallback)sleep_context_done, + self); + + g_signal_emit (self, signals[SLEEPING], 0, self->sleep_ctx); + } else if (strcmp (signalname, "SuspendDone") == 0) { + mm_obj_msg (self, "system resume signal from powerd"); + g_signal_emit (self, signals[RESUMING], 0); } } @@ -120,15 +153,14 @@ mm_sleep_monitor_init (MMSleepMonitor *self) } static void -finalize (GObject *object) +dispose (GObject *object) { MMSleepMonitor *self = MM_SLEEP_MONITOR (object); - if (self->pd_proxy) - g_object_unref (self->pd_proxy); + cleanup_sleep_context (self); + g_clear_object (&self->pd_proxy); - if (G_OBJECT_CLASS (mm_sleep_monitor_parent_class)->finalize != NULL) - G_OBJECT_CLASS (mm_sleep_monitor_parent_class)->finalize (object); + G_OBJECT_CLASS (mm_sleep_monitor_parent_class)->dispose (object); } static void @@ -144,7 +176,7 @@ mm_sleep_monitor_class_init (MMSleepMonitorClass *klass) gobject_class = G_OBJECT_CLASS (klass); - gobject_class->finalize = finalize; + gobject_class->dispose = dispose; signals[SLEEPING] = g_signal_new (MM_SLEEP_MONITOR_SLEEPING, MM_TYPE_SLEEP_MONITOR, @@ -152,8 +184,8 @@ mm_sleep_monitor_class_init (MMSleepMonitorClass *klass) G_STRUCT_OFFSET (MMSleepMonitorClass, sleeping), NULL, /* accumulator */ NULL, /* accumulator data */ - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_CANCELLABLE); signals[RESUMING] = g_signal_new (MM_SLEEP_MONITOR_RESUMING, MM_TYPE_SLEEP_MONITOR, G_SIGNAL_RUN_LAST, |