gnome-keyring r1012 - in trunk: . common
- From: nnielsen svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-keyring r1012 - in trunk: . common
- Date: Tue, 15 Jan 2008 05:00:16 +0000 (GMT)
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]