summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2015-01-16 13:32:33 +0100
committerAleksander Morgado <aleksander@aleksander.es>2015-01-16 13:43:00 +0100
commit04e4ed331e373123640595a2a32f384f45c51e07 (patch)
tree89b80a60e1d22703f171717765b22bf62dbfba50
parent7bbc6dbbf6b79b7605a506257a2a7195692d91a5 (diff)
downloadModemManager-aleksander/cancellations.tar.gz
base-modem: make sure the cancellable object is available if there are refs aroundaleksander/cancellations
In order to cancel ongoing operations properly we cannot remove the cancellable object from the private info upon dispose(), we should just cancel the cancellable and unref the last cancellable reference on finalize() instead.
-rw-r--r--src/mm-base-modem.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c
index 5510c94d1..0097964d3 100644
--- a/src/mm-base-modem.c
+++ b/src/mm-base-modem.c
@@ -1505,6 +1505,8 @@ finalize (GObject *object)
g_strfreev (self->priv->drivers);
g_free (self->priv->plugin);
+ g_object_unref (self->priv->cancellable);
+
G_OBJECT_CLASS (mm_base_modem_parent_class)->finalize (object);
}
@@ -1520,11 +1522,17 @@ dispose (GObject *object)
/* 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);
+ * another reference of the modem object around.
+ *
+ * Also, we don't want to clear the cancellable here because it must
+ * be available for mm_base_modem_peek|get_cancellable() as long
+ * as there's a modem reference around. */
+ if (self->priv->invalid_if_cancelled) {
+ g_cancellable_disconnect (self->priv->cancellable, self->priv->invalid_if_cancelled);
+ self->priv->invalid_if_cancelled = 0;
+ }
+ if (!g_cancellable_is_cancelled (self->priv->cancellable))
+ g_cancellable_cancel (self->priv->cancellable);
g_clear_object (&self->priv->primary);
g_clear_object (&self->priv->secondary);