[glib] GCancellable: drop lock for callback during connect()



commit c8aba61713ec0f674fa0dc986db3b2db3cdd0c41
Author: Ryan Lortie <desrt desrt ca>
Date:   Mon Oct 28 11:44:16 2013 -0700

    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 files changed, 9 insertions(+), 1 deletions(-)
---
diff --git a/gio/gcancellable.c b/gio/gcancellable.c
index fc56b87..0bbbf4b 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;
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]