manager: try to get all modems disabled before while shutting down

This commit is contained in:
Aleksander Morgado
2012-03-30 16:11:55 +02:00
parent 8c84aea3f0
commit 3094e3f26b
2 changed files with 22 additions and 27 deletions

View File

@@ -6071,15 +6071,13 @@ disable (MMBaseModem *self,
switch (MM_BROADBAND_MODEM (self)->priv->modem_state) {
case MM_MODEM_STATE_UNKNOWN:
case MM_MODEM_STATE_FAILED:
/* We should never have a UNKNOWN|FAILED->DISABLED transition requested by
* the user. */
g_assert_not_reached ();
break;
case MM_MODEM_STATE_INITIALIZING:
case MM_MODEM_STATE_LOCKED:
case MM_MODEM_STATE_DISABLED:
/* Just return success, don't relaunch disabling */
/* Just return success, don't relaunch disabling.
* Note that we do consider here UNKNOWN and FAILED status on purpose,
* as the MMManager will try to disable every modem before removing
* it. */
g_simple_async_result_set_op_res_gboolean (result, TRUE);
break;

View File

@@ -677,53 +677,50 @@ typedef struct {
} RemoveInfo;
static gboolean
remove_disable_one (gpointer user_data)
remove_disable_one (RemoveInfo *info)
{
RemoveInfo *info = user_data;
remove_modem (info->manager, info->modem);
g_free (info);
return FALSE;
}
static void
remove_disable_done (MMBaseModem *modem,
GError *error,
gpointer user_data)
remove_disable_ready (MMBaseModem *modem,
GAsyncResult *res,
MMManager *self)
{
RemoveInfo *info;
/* We don't care about errors disabling at this point */
mm_base_modem_disable_finish (modem, res, NULL);
/* Schedule modem removal from an idle handler since we get here deep
* in the modem removal callchain and can't remove it quite yet from here.
*/
info = g_malloc0 (sizeof (RemoveInfo));
info->manager = MM_MANAGER (user_data);
info->manager = self;
info->modem = modem;
g_idle_add (remove_disable_one, info);
g_idle_add ((GSourceFunc)remove_disable_one, info);
}
static void
foreach_disable (gpointer key,
MMBaseModem *modem,
MMManager *self)
{
mm_base_modem_disable (modem, (GAsyncReadyCallback)remove_disable_ready, self);
}
void
mm_manager_shutdown (MMManager *self)
{
GList *modems, *iter;
g_return_if_fail (self != NULL);
g_return_if_fail (MM_IS_MANAGER (self));
/* Cancel all ongoing auth requests */
g_cancellable_cancel (self->priv->authp_cancellable);
modems = g_hash_table_get_values (self->priv->modems);
for (iter = modems; iter; iter = g_list_next (iter)) {
MMBaseModem *modem = MM_BASE_MODEM (iter->data);
/* TODO */
/* if (mm_modem_get_state (modem) >= MM_MODEM_STATE_ENABLING) */
/* mm_modem_disable (modem, remove_disable_done, self); */
/* else */
remove_disable_done (modem, NULL, self);
}
g_list_free (modems);
g_hash_table_foreach (self->priv->modems, (GHFunc)foreach_disable, self);
/* Disabling may take a few iterations of the mainloop, so the caller
* has to iterate the mainloop until all devices have been disabled and