summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2012-03-30 16:11:14 +0200
committerAleksander Morgado <aleksander@lanedo.com>2012-03-30 16:11:14 +0200
commit8c84aea3f0ca03dee98efa854a2862c1c36b6c04 (patch)
tree36401a512b9bcf93de3bacf664836312f335a197
parentb68461c417172c69bdad74b0e3526037ae5916d4 (diff)
downloadModemManager-8c84aea3f0ca03dee98efa854a2862c1c36b6c04.tar.gz
base-modem: disconnect internal cancellable handler while disposing
-rw-r--r--src/mm-base-modem.c16
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);