From 7fe9e1b90c4464f3f288cecc3fa1d65bb6904cd1 Mon Sep 17 00:00:00 2001 From: fbonnet Date: Sat, 9 Jun 2018 17:20:15 +0000 Subject: Removed thread-specific mutex lock counter and replaced by shared counter + thread ID for systems without PTHREAD_MUTEX_RECURSIVE --- unix/tclUnixThrd.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/unix/tclUnixThrd.c b/unix/tclUnixThrd.c index 3d3f81d..226552f 100644 --- a/unix/tclUnixThrd.c +++ b/unix/tclUnixThrd.c @@ -53,7 +53,8 @@ PMutexInit( typedef struct PMutex { pthread_mutex_t mutex; - pthread_key_t counter; + pthread_t thread; + int counter; } PMutex; static void @@ -62,7 +63,8 @@ PMutexInit( ) { pthread_mutex_init(&pmutexPtr->mutex, NULL); - pthread_key_create(&pmutexPtr->counter, NULL); + pmutexPtr->thread = 0; + pmutexPtr->counter = 0; } static void @@ -71,7 +73,6 @@ PMutexDestroy( ) { pthread_mutex_destroy(&pmutexPtr->mutex); - pthread_key_delete(pmutexPtr->counter); } static void @@ -79,11 +80,12 @@ PMutexLock( PMutex *pmutexPtr ) { - intptr_t count = (intptr_t)pthread_getspecific(pmutexPtr->counter); - pthread_setspecific(pmutexPtr->counter, (const void *)(count+1)); - if (count == 0) { - pthread_mutex_lock(&pmutexPtr->mutex); + if (pmutexPtr->thread != pthread_self() || pmutexPtr->counter == 0) { + pthread_mutex_lock(&pmutexPtr->mutex); + pmutexPtr->thread = pthread_self(); + pmutexPtr->counter = 0; } + pmutexPtr->counter++; } static void @@ -91,10 +93,10 @@ PMutexUnlock( PMutex *pmutexPtr ) { - intptr_t count = (intptr_t)pthread_getspecific(pmutexPtr->counter); - pthread_setspecific(pmutexPtr->counter, (const void *)(count-1)); - if (count == 1) { - pthread_mutex_unlock(&pmutexPtr->mutex); + pmutexPtr->counter--; + if (pmutexPtr->counter == 0) { + pmutexPtr->thread = 0; + pthread_mutex_unlock(&pmutexPtr->mutex); } } -- cgit v0.12