summaryrefslogtreecommitdiffstats
path: root/generic/tclThread.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2015-07-23 17:09:58 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2015-07-23 17:09:58 (GMT)
commit0dfed6948cae4e926c49b5fc888b4b74b247a262 (patch)
tree085eb933a60ff0edec54f99a646543cbc8f64816 /generic/tclThread.c
parentf42f4ba9e433ebb4b0234a6c5dbf445a82fe085a (diff)
parent61947d12ec0d917d65a31b72dd14c2ee52c2ce5a (diff)
downloadtcl-0dfed6948cae4e926c49b5fc888b4b74b247a262.zip
tcl-0dfed6948cae4e926c49b5fc888b4b74b247a262.tar.gz
tcl-0dfed6948cae4e926c49b5fc888b4b74b247a262.tar.bz2
Fix bug [57945b574a6df0332efc4ac96b066f7c347b28f7|57945b574a]: lock in forking process under heavy multithreading. Thanks to Joe Mistachkin for the implementation of the fix, and Gustaf Neumann for the original report and testing the fix.
Diffstat (limited to 'generic/tclThread.c')
-rw-r--r--generic/tclThread.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/generic/tclThread.c b/generic/tclThread.c
index 198fa6a..c2112b7 100644
--- a/generic/tclThread.c
+++ b/generic/tclThread.c
@@ -284,6 +284,43 @@ Tcl_MutexFinalize(
/*
*----------------------------------------------------------------------
*
+ * TclMutexUnlockAndFinalize --
+ *
+ * This procedure is invoked to unlock and then finalize a mutex.
+ * The mutex must have been locked by Tcl_MutexLock. It is also
+ * removed from the list of remembered objects. The mutex can no
+ * longer be used after calling this procedure.
+ *
+ * Results:
+ * None.
+ *
+ * Side effects:
+ * Remove the mutex from the list.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TclMutexUnlockAndFinalize(
+ Tcl_Mutex *mutexPtr)
+{
+ Tcl_Mutex mutex;
+ TclpMasterLock();
+ TclpMutexLock();
+#ifdef TCL_THREADS
+ mutex = *mutexPtr;
+ *mutexPtr = NULL; /* Force it to be created again. */
+ Tcl_MutexUnlock(&mutex);
+ TclpFinalizeMutex(&mutex);
+#endif
+ ForgetSyncObject(mutexPtr, &mutexRecord);
+ TclpMutexUnlock();
+ TclpMasterUnlock();
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
* TclRememberCondition
*
* Keep a list of condition variables used during finalization.