From 8c84aea3f0ca03dee98efa854a2862c1c36b6c04 Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Fri, 30 Mar 2012 16:11:14 +0200 Subject: base-modem: disconnect internal cancellable handler while disposing --- src/mm-base-modem.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'src') 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); -- cgit v1.2.3-70-g09d2