diff options
-rw-r--r-- | CONTRIBUTORS | 3 | ||||
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | pthread_mutex_destroy.c | 55 |
3 files changed, 41 insertions, 23 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 7823ef4..9f6ba6a 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -102,4 +102,5 @@ Rob Fanner rfanner@stonethree.com Bug fix.
Michael Johnson michaelj@maine.rr.com
Bug fix.
-
+Nicolas Barry boozai@yahoo.com
+ Bug fix.
@@ -1,3 +1,9 @@ +2003-06-22 Nicolas Barry <boozai@yahoo.com> + + * pthread_mutex_destroy.c (pthread_mutex_destroy): When called + with a recursive mutex that was locked by the current thread, the + function was failing with a success return code. + 2003-05-15 Steven Reddie <Steven.Reddie@ca.com> * pthread_win32_attach_detach_np.c (pthread_win32_process_detach_np): diff --git a/pthread_mutex_destroy.c b/pthread_mutex_destroy.c index e217bec..fc4e684 100644 --- a/pthread_mutex_destroy.c +++ b/pthread_mutex_destroy.c @@ -63,35 +63,46 @@ pthread_mutex_destroy(pthread_mutex_t *mutex) * If trylock succeeded and the mutex is not recursively locked it * can be destroyed. */ - if (result == 0 && 1 == mx->recursive_count) + if (result == 0) { - /* - * FIXME!!! - * The mutex isn't held by another thread but we could still - * be too late invalidating the mutex below since another thread - * may already have entered mutex_lock and the check for a valid - * *mutex != NULL. - * - * Note that this would be an unusual situation because it is not - * common that mutexes are destroyed while they are still in - * use by other threads. - */ - *mutex = NULL; + if (1 == mx->recursive_count) + { + /* + * FIXME!!! + * The mutex isn't held by another thread but we could still + * be too late invalidating the mutex below since another thread + * may already have entered mutex_lock and the check for a valid + * *mutex != NULL. + * + * Note that this would be an unusual situation because it is not + * common that mutexes are destroyed while they are still in + * use by other threads. + */ + *mutex = NULL; - result = pthread_mutex_unlock(&mx); + result = pthread_mutex_unlock(&mx); - if (result == 0) - { - (void) sem_destroy( &mx->wait_sema ); - DeleteCriticalSection( &mx->wait_cs ); - free(mx); + if (result == 0) + { + (void) sem_destroy( &mx->wait_sema ); + DeleteCriticalSection( &mx->wait_cs ); + free(mx); + } + else + { + /* + * Restore the mutex before we return the error. + */ + *mutex = mx; + } } - else + else /* mx->recursive_count > 1 */ { /* - * Restore the mutex before we return the error. + * The mutex must be recursive and already locked by us (this thread). */ - *mutex = mx; + mx->recursive_count--; /* Undo effect of pthread_mutex_trylock() above */ + result = EBUSY; } } } |