From 4f39f31ea58f08dfe22df8192e8ff02943a9ed5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Fri, 1 Jul 2011 22:43:01 +0200 Subject: [PATCH] Revert "Fix lock ordering in `fat_mutex_lock' to match that of `do_thread_exit'." This reverts commit ccb80964cd7cd112e300c34d32f67125a6d6da9a, which introduced a race condition, with a small window during which a mutex could be held by a thread without being part of its `mutexes' list, thereby violating the invariant tested at line 667. --- libguile/threads.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libguile/threads.c b/libguile/threads.c index cbacfcad6..752354008 100644 --- a/libguile/threads.c +++ b/libguile/threads.c @@ -1370,7 +1370,9 @@ fat_mutex_lock (SCM mutex, scm_t_timespec *timeout, SCM owner, int *ret) { scm_i_thread *t = SCM_I_THREAD_DATA (new_owner); - scm_i_pthread_mutex_unlock (&m->lock); + /* FIXME: The order in which `t->admin_mutex' and + `m->lock' are taken differs from that in + `on_thread_exit', potentially leading to deadlocks. */ scm_i_pthread_mutex_lock (&t->admin_mutex); /* Only keep a weak reference to MUTEX so that it's not @@ -1381,7 +1383,6 @@ fat_mutex_lock (SCM mutex, scm_t_timespec *timeout, SCM owner, int *ret) t->mutexes = scm_weak_car_pair (mutex, t->mutexes); scm_i_pthread_mutex_unlock (&t->admin_mutex); - scm_i_pthread_mutex_lock (&m->lock); } *ret = 1; break;