Bug 585189 – g_cancellable_reset() must be called in same thread ...
authorBenjamin Otte <otte@gnome.org>
Tue, 9 Jun 2009 08:54:22 +0000 (10:54 +0200)
committerBenjamin Otte <otte@gnome.org>
Tue, 9 Jun 2009 10:19:24 +0000 (12:19 +0200)
... as g_cancellable_cancel()
Rework a g_critical() that would (rarely) trigger when _reset() was
called in a thread different from _cancel() by making _reset() wait for
the cancel function to be finished the same way
g_cancellable_disconnect() uses.

gio/gcancellable.c

index e54d6c8..19326b5 100644 (file)
@@ -327,11 +327,11 @@ g_cancellable_reset (GCancellable *cancellable)
 
   G_LOCK(cancellable);
   
-  if (cancellable->cancelled_running)
+  while (cancellable->cancelled_running)
     {
-      g_critical ("Can't reset a cancellable during an active operation");
-      G_UNLOCK(cancellable);
-      return;
+      cancellable->cancelled_running_waiting = TRUE;
+      g_cond_wait (cancellable_cond,
+                   g_static_mutex_get_mutex (& G_LOCK_NAME (cancellable)));
     }
   
   if (cancellable->cancelled)