summaryrefslogtreecommitdiffstats
path: root/unix
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2015-10-18 10:31:50 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2015-10-18 10:31:50 (GMT)
commitb22ebcce6b9f2e861a4c9fed13421df0c76769d6 (patch)
tree53657a059595a7b1b134a293653ae26e599e93c3 /unix
parentde3fd77202d2f00e549b962c6b56a85f5d8d7042 (diff)
parentb26b272f52e27f26233144697e4526a6f156e4c0 (diff)
downloadtcl-b22ebcce6b9f2e861a4c9fed13421df0c76769d6.zip
tcl-b22ebcce6b9f2e861a4c9fed13421df0c76769d6.tar.gz
tcl-b22ebcce6b9f2e861a4c9fed13421df0c76769d6.tar.bz2
Bring back Tcl_MutexLock() to exact implementation in Tcl 8.5.18. For details, see [ba44e415a0]: Use of mutexLock causes problem with reactive event handling in AndroWish
Diffstat (limited to 'unix')
-rw-r--r--unix/tclUnixThrd.c51
1 files changed, 2 insertions, 49 deletions
diff --git a/unix/tclUnixThrd.c b/unix/tclUnixThrd.c
index e8ad182..a7a294d 100644
--- a/unix/tclUnixThrd.c
+++ b/unix/tclUnixThrd.c
@@ -21,19 +21,6 @@ typedef struct ThreadSpecificData {
static Tcl_ThreadDataKey dataKey;
/*
- * This is the number of milliseconds to wait between internal retries in
- * the Tcl_MutexLock function. This value must be greater than zero and
- * should be a suitable value for the given platform.
- *
- * TODO: This may need to be dynamically determined, based on the relative
- * performance of the running process.
- */
-
-#ifndef TCL_MUTEX_LOCK_SLEEP_TIME
-# define TCL_MUTEX_LOCK_SLEEP_TIME (25)
-#endif
-
-/*
* masterLock is used to serialize creation of mutexes, condition variables,
* and thread local storage. This is the only place that can count on the
* ability to statically initialize the mutex.
@@ -57,13 +44,6 @@ static pthread_mutex_t allocLock = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t *allocLockPtr = &allocLock;
/*
- * The mutexLock serializes Tcl_MutexLock. This is necessary to prevent
- * races when finalizing a mutex that some other thread may want to lock.
- */
-
-static pthread_mutex_t mutexLock = PTHREAD_MUTEX_INITIALIZER;
-
-/*
* These are for the critical sections inside this file.
*/
@@ -472,7 +452,6 @@ TclpMasterUnlock(void)
pthread_mutex_unlock(&masterLock);
#endif
}
-
/*
*----------------------------------------------------------------------
@@ -533,8 +512,6 @@ Tcl_MutexLock(
{
pthread_mutex_t *pmutexPtr;
-retry:
-
if (*mutexPtr == NULL) {
MASTER_LOCK;
if (*mutexPtr == NULL) {
@@ -549,32 +526,8 @@ retry:
}
MASTER_UNLOCK;
}
- while (1) {
- pthread_mutex_lock(&mutexLock);
- pmutexPtr = *((pthread_mutex_t **)mutexPtr);
- if (pmutexPtr == NULL) {
- pthread_mutex_unlock(&mutexLock);
- goto retry;
- }
- if (pthread_mutex_trylock(pmutexPtr) == 0) {
- pthread_mutex_unlock(&mutexLock);
- return;
- }
- pthread_mutex_unlock(&mutexLock);
- /*
- * BUGBUG: All core and Thread package tests pass when usleep()
- * is used; however, the Thread package tests hang at
- * various places when Tcl_Sleep() is used, typically
- * while running test "thread-17.8", "thread-17.9", or
- * "thread-17.11a". Really, what we want here is just
- * to yield to other threads for a while.
- */
-#ifdef HAVE_USLEEP
- usleep(TCL_MUTEX_LOCK_SLEEP_TIME * 1000);
-#else
- Tcl_Sleep(TCL_MUTEX_LOCK_SLEEP_TIME);
-#endif
- }
+ pmutexPtr = *((pthread_mutex_t **)mutexPtr);
+ pthread_mutex_lock(pmutexPtr);
}
/*