diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-30 16:11:14 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-30 16:11:14 +0200 |
commit | 8c84aea3f0ca03dee98efa854a2862c1c36b6c04 (patch) | |
tree | 36401a512b9bcf93de3bacf664836312f335a197 | |
parent | b68461c417172c69bdad74b0e3526037ae5916d4 (diff) | |
download | ModemManager-8c84aea3f0ca03dee98efa854a2862c1c36b6c04.tar.gz |
base-modem: disconnect internal cancellable handler while disposing
-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 5da180c24..5517fcc48 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); |