From 5ef5ad3390c967520922b99b130ed6339aa3a8d6 Mon Sep 17 00:00:00 2001 From: rpj Date: Fri, 20 Sep 2002 02:35:51 +0000 Subject: 2002-09-20 Michael Johnson * pthread_cond_destroy.c (pthread_cond_destroy): When two different threads exist, and one is attempting to destroy a condition variable while the other is attempting to initialize a condition variable that was created with PTHREAD_COND_INITIALIZER, a deadlock can occur. Shrink the ptw32_cond_list_lock critical section to fix it. --- CONTRIBUTORS | 2 ++ ChangeLog | 9 +++++++++ pthread_cond_destroy.c | 8 ++++---- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 513b637..78bb7a1 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -98,3 +98,5 @@ Max Woodbury mtew@cds.duke.edu reduced namespace pollution; idea to separate routines to reduce statically linked image sizes. +Michael Johnson michaelj@maine.rr.com + Bug fix. diff --git a/ChangeLog b/ChangeLog index 16a9fa3..15aa349 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2002-09-20 Michael Johnson + + * pthread_cond_destroy.c (pthread_cond_destroy): + When two different threads exist, and one is attempting to + destroy a condition variable while the other is attempting to + initialize a condition variable that was created with + PTHREAD_COND_INITIALIZER, a deadlock can occur. Shrink + the ptw32_cond_list_lock critical section to fix it. + 2002-07-31 Ross Johnson * ptw32_threadStart.c (ptw32_threadStart): Thread cancelLock diff --git a/pthread_cond_destroy.c b/pthread_cond_destroy.c index 9c4a214..79a0020 100644 --- a/pthread_cond_destroy.c +++ b/pthread_cond_destroy.c @@ -126,10 +126,10 @@ pthread_cond_destroy (pthread_cond_t * cond) return EINVAL; } - EnterCriticalSection(&ptw32_cond_list_lock); - if (*cond != PTHREAD_COND_INITIALIZER) { + EnterCriticalSection(&ptw32_cond_list_lock); + cv = *cond; /* @@ -207,6 +207,8 @@ pthread_cond_destroy (pthread_cond_t * cond) (void) free(cv); } + + LeaveCriticalSection(&ptw32_cond_list_lock); } else { @@ -240,7 +242,5 @@ pthread_cond_destroy (pthread_cond_t * cond) LeaveCriticalSection(&ptw32_cond_test_init_lock); } - LeaveCriticalSection(&ptw32_cond_list_lock); - return ((result != 0) ? result : ((result1 != 0) ? result1 : result2)); } -- cgit v1.2.3