diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-base-modem.c | 91 |
1 files changed, 59 insertions, 32 deletions
diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c index 60ad8b2e..d4d06bbe 100644 --- a/src/mm-base-modem.c +++ b/src/mm-base-modem.c @@ -1446,6 +1446,62 @@ base_modem_cancelled (GCancellable *cancellable, /*****************************************************************************/ static void +setup_ports_table (MMBaseModem *self) +{ + g_assert (!self->priv->ports); + self->priv->ports = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + g_object_unref); +} + +static void +cleanup_modem_port (MMBaseModem *self, + MMPort *port) +{ + mm_dbg ("cleaning up port '%s/%s'...", + mm_port_subsys_get_string (mm_port_get_subsys (MM_PORT (port))), + mm_port_get_device (MM_PORT (port))); + +#if defined WITH_MBIM + /* We need to close the MBIM port cleanly when disposing the modem object */ + if (MM_IS_PORT_MBIM (port)) { + mm_port_mbim_close (MM_PORT_MBIM (port), NULL, NULL); + return; + } +#endif + +#if defined WITH_QMI + /* We need to close the QMI port cleanly when disposing the modem object, + * otherwise the allocated CIDs will be kept allocated, and if we end up + * allocating too many newer allocations will fail with client-ids-exhausted + * errors. */ + if (MM_IS_PORT_QMI (port)) { + mm_port_qmi_close (MM_PORT_QMI (port), NULL, NULL); + return; + } +#endif +} + +static void +teardown_ports_table (MMBaseModem *self) +{ + GHashTableIter iter; + gpointer value; + gpointer key; + + if (!self->priv->ports) + return; + + g_hash_table_iter_init (&iter, self->priv->ports); + while (g_hash_table_iter_next (&iter, &key, &value)) + cleanup_modem_port (self, MM_PORT (value)); + g_hash_table_destroy (g_steal_pointer (&self->priv->ports)); +} + +/*****************************************************************************/ + +static void mm_base_modem_init (MMBaseModem *self) { /* Initialize private data */ @@ -1465,12 +1521,9 @@ mm_base_modem_init (MMBaseModem *self) self, NULL); - self->priv->ports = g_hash_table_new_full (g_str_hash, - g_str_equal, - g_free, - g_object_unref); - self->priv->max_timeouts = DEFAULT_MAX_TIMEOUTS; + + setup_ports_table (self); } static void @@ -1584,22 +1637,6 @@ finalize (GObject *object) G_OBJECT_CLASS (mm_base_modem_parent_class)->finalize (object); } -#if defined WITH_QMI -static void -foreach_port_qmi_close (MMPortQmi *port_qmi) -{ - mm_port_qmi_close (port_qmi, NULL, NULL); -} -#endif - -#if defined WITH_MBIM -static void -foreach_port_mbim_close (MMPortMbim *port_mbim) -{ - mm_port_mbim_close (port_mbim, NULL, NULL); -} -#endif - static void dispose (GObject *object) { @@ -1627,25 +1664,15 @@ dispose (GObject *object) g_clear_object (&self->priv->gps); g_clear_object (&self->priv->audio); #if defined WITH_QMI - /* We need to close the QMI port cleanly when disposing the modem object, - * otherwise the allocated CIDs will be kept allocated, and if we end up - * allocating too many newer allocations will fail with client-ids-exhausted - * errors. */ - g_list_foreach (self->priv->qmi, (GFunc)foreach_port_qmi_close, NULL); g_list_free_full (self->priv->qmi, g_object_unref); self->priv->qmi = NULL; #endif #if defined WITH_MBIM - /* We need to close the MBIM port cleanly when disposing the modem object */ - g_list_foreach (self->priv->mbim, (GFunc)foreach_port_mbim_close, NULL); g_list_free_full (self->priv->mbim, g_object_unref); self->priv->mbim = NULL; #endif - if (self->priv->ports) { - g_hash_table_destroy (self->priv->ports); - self->priv->ports = NULL; - } + teardown_ports_table (self); g_clear_object (&self->priv->connection); |