diff options
author | marha <marha@users.sourceforge.net> | 2011-07-18 10:33:05 +0200 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2011-07-18 10:33:05 +0200 |
commit | 88101146f2ec7d53ffb793e365f05097ffd35fd3 (patch) | |
tree | db77eef572a00c62c8d9485c4786f682e20a2fd0 /pthreads/pthread_mutex_destroy.c | |
parent | 772373ccc8da2b2019555228f4972cc0c5a885a4 (diff) | |
download | vcxsrv-88101146f2ec7d53ffb793e365f05097ffd35fd3.tar.gz vcxsrv-88101146f2ec7d53ffb793e365f05097ffd35fd3.tar.bz2 vcxsrv-88101146f2ec7d53ffb793e365f05097ffd35fd3.zip |
cvs version of pthreads
Diffstat (limited to 'pthreads/pthread_mutex_destroy.c')
-rw-r--r-- | pthreads/pthread_mutex_destroy.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/pthreads/pthread_mutex_destroy.c b/pthreads/pthread_mutex_destroy.c index 95509b3df..7b8c9cd65 100644 --- a/pthreads/pthread_mutex_destroy.c +++ b/pthreads/pthread_mutex_destroy.c @@ -61,7 +61,7 @@ pthread_mutex_destroy (pthread_mutex_t * mutex) * If trylock succeeded and the mutex is not recursively locked it * can be destroyed. */ - if (result == 0) + if (0 == result || ENOTRECOVERABLE == result) { if (mx->kind != PTHREAD_MUTEX_RECURSIVE || 1 == mx->recursive_count) { @@ -71,17 +71,17 @@ pthread_mutex_destroy (pthread_mutex_t * mutex) * 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 = (0 == result)?pthread_mutex_unlock(&mx):0; - if (result == 0) + if (0 == result) { + if (mx->robustNode != NULL) + { + free(mx->robustNode); + } if (!CloseHandle (mx->event)) { *mutex = mx; @@ -112,10 +112,13 @@ pthread_mutex_destroy (pthread_mutex_t * mutex) } else { + ptw32_mcs_local_node_t node; + /* * See notes in ptw32_mutex_check_need_init() above also. */ - EnterCriticalSection (&ptw32_mutex_test_init_lock); + + ptw32_mcs_lock_acquire(&ptw32_mutex_test_init_lock, &node); /* * Check again. @@ -138,8 +141,7 @@ pthread_mutex_destroy (pthread_mutex_t * mutex) */ result = EBUSY; } - - LeaveCriticalSection (&ptw32_mutex_test_init_lock); + ptw32_mcs_lock_release(&node); } return (result); |