From 04e4ed331e373123640595a2a32f384f45c51e07 Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Fri, 16 Jan 2015 13:32:33 +0100 Subject: base-modem: make sure the cancellable object is available if there are refs around 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. --- src/mm-base-modem.c | 18 +++++++++++++----- 1 file 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); -- cgit v1.2.1