manager: try to get all modems disabled before while shutting down
This commit is contained in:
@@ -6071,15 +6071,13 @@ disable (MMBaseModem *self,
|
|||||||
switch (MM_BROADBAND_MODEM (self)->priv->modem_state) {
|
switch (MM_BROADBAND_MODEM (self)->priv->modem_state) {
|
||||||
case MM_MODEM_STATE_UNKNOWN:
|
case MM_MODEM_STATE_UNKNOWN:
|
||||||
case MM_MODEM_STATE_FAILED:
|
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_INITIALIZING:
|
||||||
case MM_MODEM_STATE_LOCKED:
|
case MM_MODEM_STATE_LOCKED:
|
||||||
case MM_MODEM_STATE_DISABLED:
|
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);
|
g_simple_async_result_set_op_res_gboolean (result, TRUE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@@ -677,53 +677,50 @@ typedef struct {
|
|||||||
} RemoveInfo;
|
} RemoveInfo;
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
remove_disable_one (gpointer user_data)
|
remove_disable_one (RemoveInfo *info)
|
||||||
{
|
{
|
||||||
RemoveInfo *info = user_data;
|
|
||||||
|
|
||||||
remove_modem (info->manager, info->modem);
|
remove_modem (info->manager, info->modem);
|
||||||
g_free (info);
|
g_free (info);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
remove_disable_done (MMBaseModem *modem,
|
remove_disable_ready (MMBaseModem *modem,
|
||||||
GError *error,
|
GAsyncResult *res,
|
||||||
gpointer user_data)
|
MMManager *self)
|
||||||
{
|
{
|
||||||
RemoveInfo *info;
|
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
|
/* 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.
|
* in the modem removal callchain and can't remove it quite yet from here.
|
||||||
*/
|
*/
|
||||||
info = g_malloc0 (sizeof (RemoveInfo));
|
info = g_malloc0 (sizeof (RemoveInfo));
|
||||||
info->manager = MM_MANAGER (user_data);
|
info->manager = self;
|
||||||
info->modem = modem;
|
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
|
void
|
||||||
mm_manager_shutdown (MMManager *self)
|
mm_manager_shutdown (MMManager *self)
|
||||||
{
|
{
|
||||||
GList *modems, *iter;
|
|
||||||
|
|
||||||
g_return_if_fail (self != NULL);
|
g_return_if_fail (self != NULL);
|
||||||
g_return_if_fail (MM_IS_MANAGER (self));
|
g_return_if_fail (MM_IS_MANAGER (self));
|
||||||
|
|
||||||
/* Cancel all ongoing auth requests */
|
/* Cancel all ongoing auth requests */
|
||||||
g_cancellable_cancel (self->priv->authp_cancellable);
|
g_cancellable_cancel (self->priv->authp_cancellable);
|
||||||
|
|
||||||
modems = g_hash_table_get_values (self->priv->modems);
|
g_hash_table_foreach (self->priv->modems, (GHFunc)foreach_disable, self);
|
||||||
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);
|
|
||||||
|
|
||||||
/* Disabling may take a few iterations of the mainloop, so the caller
|
/* Disabling may take a few iterations of the mainloop, so the caller
|
||||||
* has to iterate the mainloop until all devices have been disabled and
|
* has to iterate the mainloop until all devices have been disabled and
|
||||||
|
Reference in New Issue
Block a user