gnome-keyring r1012 - in trunk: . common



Author: nnielsen
Date: Tue Jan 15 05:00:16 2008
New Revision: 1012
URL: http://svn.gnome.org/viewvc/gnome-keyring?rev=1012&view=rev

Log:
	* common/gkr-async.c: Fix race condition that is causing 
	a deadlock in bug #502603.



Modified:
   trunk/ChangeLog
   trunk/common/gkr-async.c

Modified: trunk/common/gkr-async.c
==============================================================================
--- trunk/common/gkr-async.c	(original)
+++ trunk/common/gkr-async.c	Tue Jan 15 05:00:16 2008
@@ -34,6 +34,10 @@
 
 #define DEBUG_LOCKS 0
 
+/* 
+ * See comments on async_poll_func() on the order of the various
+ * gets and sets of waiting_on_* flags.
+ */
 #if DEBUG_LOCKS
 #define DO_LOCK(mtx) G_STMT_START { \
 		g_printerr ("%s LOCK %s\n", __func__, G_STRINGIFY(mtx));  \
@@ -93,8 +97,18 @@
 	gint ret;
 	
 	g_assert (orig_poll_func);
+
+	/* 
+	 * These two atomic variables are interlocked in the 
+	 * opposite order from those in DO_LOCK which prevents
+	 * race conditions in the if statements.
+	 */
 	g_atomic_int_set (&waiting_on_poll, 1);
+	if (g_atomic_int_get (&waiting_on_lock))
+		timeout = 0;
+
 	ret = (orig_poll_func) (ufds, nfsd, timeout);
+
 	g_atomic_int_set (&waiting_on_poll, 0);
 	
  	if (done_queue && !g_queue_is_empty (done_queue))
@@ -314,7 +328,6 @@
 		running_workers = NULL;
 		
 		g_assert (main_loop);
-		gkr_wakeup_register (g_main_loop_get_context (main_loop));
 		return FALSE;
 	}
 	
@@ -346,7 +359,6 @@
 	
 	if (!done_queue) {
 		g_assert (main_loop);
-		gkr_wakeup_register (g_main_loop_get_context (main_loop));
 		
 		done_queue = g_queue_new ();
 		g_assert (!running_workers);



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