summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornijtmans@users.sourceforge.net <jan.nijtmans>2015-10-17 07:21:19 (GMT)
committernijtmans@users.sourceforge.net <jan.nijtmans>2015-10-17 07:21:19 (GMT)
commit5bb2e6616a53873dce013a0bbc31c7644afd8058 (patch)
tree88987abaa7de45d75d5885ac60b37b3fbf448acd
parent40596cce9ad690610762cd081a8911f6516c1a13 (diff)
downloadtcl-5bb2e6616a53873dce013a0bbc31c7644afd8058.zip
tcl-5bb2e6616a53873dce013a0bbc31c7644afd8058.tar.gz
tcl-5bb2e6616a53873dce013a0bbc31c7644afd8058.tar.bz2
Proposed fix for [ba44e415a0]: "Use of mutexLock causes problem with reactive event handling in AndroWish".
This basically undoes the retry mechamism in Tcl_MutexLock, introduced in [9f8b7bea53]. Does this retry mechamism hurt more than it helps? Feedback requested.
-rw-r--r--unix/tclUnixThrd.c51
-rw-r--r--win/tclWinThrd.c37
2 files changed, 10 insertions, 78 deletions
diff --git a/unix/tclUnixThrd.c b/unix/tclUnixThrd.c
index ae81c5f..0e8070d 100644
--- a/unix/tclUnixThrd.c
+++ b/unix/tclUnixThrd.c
@@ -22,19 +22,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.
@@ -58,13 +45,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.
*/
@@ -380,7 +360,6 @@ TclpMasterUnlock(void)
pthread_mutex_unlock(&masterLock);
#endif
}
-
/*
*----------------------------------------------------------------------
@@ -457,32 +436,12 @@ 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);
+ if (pmutexPtr == NULL) {
+ goto retry;
}
+ pthread_mutex_lock(pmutexPtr);
}
/*
diff --git a/win/tclWinThrd.c b/win/tclWinThrd.c
index ae7ce80..927e115 100644
--- a/win/tclWinThrd.c
+++ b/win/tclWinThrd.c
@@ -24,16 +24,6 @@ _CRTIMP unsigned int __cdecl _controlfp (unsigned int unNew, unsigned int unMask
#endif
/*
- * This is the number of milliseconds to wait between internal retries in
- * the Tcl_MutexLock function. This value must be greater than or equal
- * to zero and should be a suitable value for the given platform.
- */
-
-#ifndef TCL_MUTEX_LOCK_SLEEP_TIME
-# define TCL_MUTEX_LOCK_SLEEP_TIME (0)
-#endif
-
-/*
* This is the master lock used to serialize access to other serialization
* data structures.
*/
@@ -67,13 +57,6 @@ static int allocOnce = 0;
#endif /* TCL_THREADS */
/*
- * The mutexLock serializes Tcl_MutexLock. This is necessary to prevent
- * races when finalizing a mutex that some other thread may want to lock.
- */
-
-static CRITICAL_SECTION mutexLock;
-
-/*
* The joinLock serializes Create- and ExitThread. This is necessary to
* prevent a race where a new joinable thread exits before the creating thread
* had the time to create the necessary data structures in the emulation
@@ -386,7 +369,6 @@ TclpInitLock(void)
*/
init = 1;
- InitializeCriticalSection(&mutexLock);
InitializeCriticalSection(&joinLock);
InitializeCriticalSection(&initLock);
InitializeCriticalSection(&masterLock);
@@ -534,7 +516,6 @@ void
TclFinalizeLock(void)
{
MASTER_LOCK;
- DeleteCriticalSection(&mutexLock);
DeleteCriticalSection(&joinLock);
/*
@@ -605,20 +586,12 @@ retry:
}
MASTER_UNLOCK;
}
- while (1) {
- EnterCriticalSection(&mutexLock);
- csPtr = *((CRITICAL_SECTION **)mutexPtr);
- if (csPtr == NULL) {
- LeaveCriticalSection(&mutexLock);
- goto retry;
- }
- if (TryEnterCriticalSection(csPtr)) {
- LeaveCriticalSection(&mutexLock);
- return;
- }
- LeaveCriticalSection(&mutexLock);
- Tcl_Sleep(TCL_MUTEX_LOCK_SLEEP_TIME);
+
+ csPtr = *((CRITICAL_SECTION **)mutexPtr);
+ if (csPtr == NULL) {
+ goto retry;
}
+ EnterCriticalSection(csPtr);
}
/*