diff options
Diffstat (limited to 'src/mm-base-modem.c')
-rw-r--r-- | src/mm-base-modem.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c index 5da180c2..5517fcc4 100644 --- a/src/mm-base-modem.c +++ b/src/mm-base-modem.c @@ -56,6 +56,7 @@ struct _MMBaseModemPrivate { /* Modem-wide cancellable. If it ever gets cancelled, no further operations * should be done by the modem. */ GCancellable *cancellable; + gulong invalid_if_cancelled; gchar *device; gchar *driver; @@ -877,10 +878,11 @@ mm_base_modem_init (MMBaseModem *self) /* Setup modem-wide cancellable */ self->priv->cancellable = g_cancellable_new (); - g_cancellable_connect (self->priv->cancellable, - G_CALLBACK (base_modem_cancelled), - self, - NULL); + self->priv->invalid_if_cancelled = + g_cancellable_connect (self->priv->cancellable, + G_CALLBACK (base_modem_cancelled), + self, + NULL); self->priv->ports = g_hash_table_new_full (g_str_hash, g_str_equal, @@ -1000,7 +1002,11 @@ dispose (GObject *object) g_clear_object (&self->priv->authp_cancellable); g_clear_object (&self->priv->authp); - /* Ensure we cancel any ongoing operation */ + /* Ensure we cancel any ongoing operation, but before + * disconnect our own signal handler, or we'll end up with + * another reference of the modem object around. */ + g_cancellable_disconnect (self->priv->cancellable, + self->priv->invalid_if_cancelled); g_cancellable_cancel (self->priv->cancellable); g_clear_object (&self->priv->cancellable); |