summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);