diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2015-01-16 13:32:33 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2015-01-16 13:43:00 +0100 |
commit | 04e4ed331e373123640595a2a32f384f45c51e07 (patch) | |
tree | 89b80a60e1d22703f171717765b22bf62dbfba50 | |
parent | 7bbc6dbbf6b79b7605a506257a2a7195692d91a5 (diff) | |
download | ModemManager-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.c | 18 |
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); |