From c8aba61713ec0f674fa0dc986db3b2db3cdd0c41 Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Mon, 28 Oct 2013 11:44:16 -0700 Subject: [PATCH] GCancellable: drop lock for callback during connect() Don't hold the lock when calling the user's callback during g_cancellable_connect() for the case that the cancellable has already fired. Taken from a patch by Alex Larsson. Doc updates from Colin Walters. https://bugzilla.gnome.org/show_bug.cgi?id=705395 --- gio/gcancellable.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/gio/gcancellable.c b/gio/gcancellable.c index fc56b87ce..0bbbf4b08 100644 --- a/gio/gcancellable.c +++ b/gio/gcancellable.c @@ -535,6 +535,11 @@ g_cancellable_cancel (GCancellable *cancellable) * * See #GCancellable::cancelled for details on how to use this. * + * Since GLib 2.40, the lock protecting @cancellable is not held when + * @callback is invoked. This lifts a restriction in place for + * earlier GLib versions which now makes it easier to write cleanup + * code that unconditionally invokes e.g. g_cancellable_cancel(). + * * Returns: The id of the signal handler or 0 if @cancellable has already * been cancelled. * @@ -557,6 +562,8 @@ g_cancellable_connect (GCancellable *cancellable, void (*_callback) (GCancellable *cancellable, gpointer user_data); + g_mutex_unlock (&cancellable_mutex); + _callback = (void *)callback; id = 0; @@ -571,9 +578,10 @@ g_cancellable_connect (GCancellable *cancellable, callback, data, (GClosureNotify) data_destroy_func, 0); + + g_mutex_unlock (&cancellable_mutex); } - g_mutex_unlock (&cancellable_mutex); return id; }