summaryrefslogtreecommitdiffstats
path: root/unix/tclUnixNotfy.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 /unix/tclUnixNotfy.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 'unix/tclUnixNotfy.c')
-rw-r--r--unix/tclUnixNotfy.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/unix/tclUnixNotfy.c b/unix/tclUnixNotfy.c
index b2bea45..17fdc95 100644
--- a/unix/tclUnixNotfy.c
+++ b/unix/tclUnixNotfy.c
@@ -1334,6 +1334,9 @@ NotifierThreadProc(
static void
AtForkPrepare(void)
{
+ Tcl_MutexLock(&notifierMutex);
+ TclpMasterLock();
+ TclpMutexLock();
}
/*
@@ -1355,6 +1358,9 @@ AtForkPrepare(void)
static void
AtForkParent(void)
{
+ TclpMutexUnlock();
+ TclpMasterUnlock();
+ Tcl_MutexUnlock(&notifierMutex);
}
/*
@@ -1376,7 +1382,9 @@ AtForkParent(void)
static void
AtForkChild(void)
{
- Tcl_MutexFinalize(&notifierMutex);
+ TclpMutexUnlock();
+ TclpMasterUnlock();
+ TclMutexUnlockAndFinalize(&notifierMutex);
Tcl_InitNotifier();
}
#endif /* HAVE_PTHREAD_ATFORK */