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. --- pthread_cond_destroy.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'pthread_cond_destroy.c') 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