diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 16 | ||||
-rw-r--r-- | src/mm-base-manager.c | 23 | ||||
-rw-r--r-- | src/mm-base-manager.h | 3 |
3 files changed, 33 insertions, 9 deletions
@@ -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); |