aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-broadband-modem-mbim.c14
-rw-r--r--src/mm-broadband-modem-qmi.c13
2 files changed, 26 insertions, 1 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index 81baf043..6ff008e8 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -5319,11 +5319,14 @@ mm_broadband_modem_mbim_init (MMBroadbandModemMbim *self)
}
static void
-finalize (GObject *object)
+dispose (GObject *object)
{
MMBroadbandModemMbim *self = MM_BROADBAND_MODEM_MBIM (object);
MMPortMbim *mbim;
+ /* If any port cleanup is needed, it must be done during dispose(), as
+ * the modem object will be affected by an explciit g_object_run_dispose()
+ * that will remove all port references right away */
mbim = mm_base_modem_peek_port_mbim (MM_BASE_MODEM (self));
if (mbim) {
/* Explicitly remove notification handler */
@@ -5336,6 +5339,14 @@ finalize (GObject *object)
mm_port_mbim_close (mbim, NULL, NULL);
}
+ G_OBJECT_CLASS (mm_broadband_modem_mbim_parent_class)->dispose (object);
+}
+
+static void
+finalize (GObject *object)
+{
+ MMBroadbandModemMbim *self = MM_BROADBAND_MODEM_MBIM (object);
+
g_free (self->priv->caps_device_id);
g_free (self->priv->caps_firmware_info);
g_free (self->priv->caps_hardware_info);
@@ -5600,6 +5611,7 @@ mm_broadband_modem_mbim_class_init (MMBroadbandModemMbimClass *klass)
g_type_class_add_private (object_class, sizeof (MMBroadbandModemMbimPrivate));
+ object_class->dispose = dispose;
object_class->finalize = finalize;
broadband_modem_class->initialization_started = initialization_started;
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c
index 5f89efba..abb0ce87 100644
--- a/src/mm-broadband-modem-qmi.c
+++ b/src/mm-broadband-modem-qmi.c
@@ -8650,6 +8650,19 @@ static void
dispose (GObject *object)
{
MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (object);
+ MMPortQmi *qmi;
+
+ /* If any port cleanup is needed, it must be done during dispose(), as
+ * the modem object will be affected by an explciit g_object_run_dispose()
+ * that will remove all port references right away */
+ qmi = mm_base_modem_peek_port_qmi (MM_BASE_MODEM (self));
+ if (qmi) {
+ /* Disconnect signal handler for qmi-proxy disappearing, if it exists */
+ untrack_qmi_device_removed (self, qmi);
+ /* If we did open the QMI port during initialization, close it now */
+ if (mm_port_qmi_is_open (qmi))
+ mm_port_qmi_close (qmi);
+ }
g_list_free_full (self->priv->firmware_list, g_object_unref);
self->priv->firmware_list = NULL;