aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.c16
-rw-r--r--src/mm-base-manager.c23
-rw-r--r--src/mm-base-manager.h3
3 files changed, 33 insertions, 9 deletions
diff --git a/src/main.c b/src/main.c
index 009399d3..e57ff27a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -63,10 +63,10 @@ sleeping_cb (MMSleepMonitor *sleep_monitor)
{
if (mm_context_get_test_low_power_suspend_resume ()) {
mm_dbg ("removing devices and setting them in low power mode... (sleeping)");
- mm_base_manager_shutdown (manager, TRUE, TRUE);
+ mm_base_manager_shutdown (manager, TRUE, TRUE, TRUE);
} else {
mm_dbg ("removing devices... (sleeping)");
- mm_base_manager_shutdown (manager, FALSE, FALSE);
+ mm_base_manager_shutdown (manager, FALSE, FALSE, TRUE);
}
}
@@ -78,6 +78,15 @@ resuming_cb (MMSleepMonitor *sleep_monitor)
}
static void
+sleeping_quick_cb (MMSleepMonitor *sleep_monitor)
+{
+ if (mm_context_get_test_low_power_suspend_resume ()) {
+ mm_dbg ("setting modem in low power mode... (sleeping)");
+ mm_base_manager_shutdown (manager, TRUE, TRUE, FALSE);
+ }
+}
+
+static void
resuming_quick_cb (MMSleepMonitor *sleep_monitor)
{
mm_dbg ("syncing modem state (quick resuming)");
@@ -211,6 +220,7 @@ main (int argc, char *argv[])
else if (mm_context_get_test_quick_suspend_resume ()) {
mm_dbg ("Quick suspend/resume hooks enabled");
sleep_monitor = mm_sleep_monitor_get ();
+ g_signal_connect (sleep_monitor, MM_SLEEP_MONITOR_SLEEPING, G_CALLBACK (sleeping_quick_cb), NULL);
g_signal_connect (sleep_monitor, MM_SLEEP_MONITOR_RESUMING, G_CALLBACK (resuming_quick_cb), NULL);
} else {
mm_dbg ("Full suspend/resume hooks enabled");
@@ -233,7 +243,7 @@ main (int argc, char *argv[])
if (manager) {
GTimer *timer;
- mm_base_manager_shutdown (manager, TRUE, FALSE);
+ mm_base_manager_shutdown (manager, TRUE, FALSE, TRUE);
/* Wait for all modems to be disabled and removed, but don't wait
* forever: if disabling the modems takes longer than 20s, just
diff --git a/src/mm-base-manager.c b/src/mm-base-manager.c
index 930cd504..eec4cd86 100644
--- a/src/mm-base-manager.c
+++ b/src/mm-base-manager.c
@@ -656,6 +656,7 @@ mm_base_manager_start (MMBaseManager *self,
typedef struct {
MMBaseManager *self;
gboolean low_power;
+ gboolean remove;
} DisableContext;
static void
@@ -691,7 +692,10 @@ shutdown_low_power_ready (MMIfaceModem *modem,
if (!mm_iface_modem_set_power_state_finish (modem, res, &error))
mm_obj_info (ctx->self, "changing to low power state failed: %s", error->message);
- remove_device_after_disable (MM_BASE_MODEM (modem), ctx);
+ if (ctx->remove)
+ remove_device_after_disable (MM_BASE_MODEM (modem), ctx);
+ else
+ disable_context_free (ctx);
}
static void
@@ -714,7 +718,10 @@ shutdown_disable_ready (MMBaseModem *modem,
return;
}
- remove_device_after_disable (modem, ctx);
+ if (ctx->remove)
+ remove_device_after_disable (modem, ctx);
+ else
+ disable_context_free (ctx);
}
static void
@@ -732,6 +739,8 @@ foreach_disable (gpointer key,
ctx = g_slice_new0 (DisableContext);
ctx->self = g_object_ref (foreach_ctx->self);
ctx->low_power = foreach_ctx->low_power;
+ ctx->remove = foreach_ctx->remove;
+
mm_base_modem_disable (modem, (GAsyncReadyCallback)shutdown_disable_ready, ctx);
}
@@ -752,7 +761,8 @@ foreach_remove (gpointer key,
void
mm_base_manager_shutdown (MMBaseManager *self,
gboolean disable,
- gboolean low_power)
+ gboolean low_power,
+ gboolean remove)
{
g_return_if_fail (self != NULL);
g_return_if_fail (MM_IS_BASE_MANAGER (self));
@@ -764,6 +774,7 @@ mm_base_manager_shutdown (MMBaseManager *self,
DisableContext foreach_ctx = {
.self = self,
.low_power = low_power,
+ .remove = remove,
};
g_hash_table_foreach (self->priv->devices, (GHFunc)foreach_disable, &foreach_ctx);
@@ -774,8 +785,10 @@ mm_base_manager_shutdown (MMBaseManager *self,
return;
}
- /* Otherwise, just remove directly */
- g_hash_table_foreach_remove (self->priv->devices, (GHRFunc)foreach_remove, self);
+ if (remove) {
+ /* Otherwise, just remove directly */
+ g_hash_table_foreach_remove (self->priv->devices, (GHRFunc)foreach_remove, self);
+ }
}
guint32
diff --git a/src/mm-base-manager.h b/src/mm-base-manager.h
index b49c97d6..ddce5727 100644
--- a/src/mm-base-manager.h
+++ b/src/mm-base-manager.h
@@ -73,7 +73,8 @@ void mm_base_manager_start (MMBaseManager *manager,
void mm_base_manager_shutdown (MMBaseManager *manager,
gboolean disable,
- gboolean power_low);
+ gboolean power_low,
+ gboolean remove);
#if defined WITH_SUSPEND_RESUME
void mm_base_manager_sync (MMBaseManager *manager);