aboutsummaryrefslogtreecommitdiff
path: root/src/mm-sleep-monitor-powerd.c
diff options
context:
space:
mode:
authorDan Williams <dan@ioncontrol.co>2025-03-08 14:25:04 -0600
committerDan Williams <dan@ioncontrol.co>2025-05-07 22:59:51 -0500
commitf4cbca56d5cea3ac865e6f113712752a98df2509 (patch)
tree6e777d920734a6e7815227aafc2a9c9b90891970 /src/mm-sleep-monitor-powerd.c
parent6350b0a85f76e830b3749933c4ee7e926c8686ad (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.c66
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,