diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2016-03-21 14:22:52 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2016-03-21 14:22:52 (GMT) |
commit | a4933e22d0b56bf07cf35cb90eb1f6fd6c9e48cb (patch) | |
tree | 78f3a200ccbd78c4776b48659f02ed1690a253dd /unix | |
parent | 349c1fd2676793625cc0037a11d5989b0a591397 (diff) | |
download | tcl-a4933e22d0b56bf07cf35cb90eb1f6fd6c9e48cb.zip tcl-a4933e22d0b56bf07cf35cb90eb1f6fd6c9e48cb.tar.gz tcl-a4933e22d0b56bf07cf35cb90eb1f6fd6c9e48cb.tar.bz2 |
(experiment) Use TclpMasterLock() in stead of a separate notifierInitMutex. One less mutex to be worried about.
Diffstat (limited to 'unix')
-rw-r--r-- | unix/tclUnixNotfy.c | 21 | ||||
-rw-r--r-- | unix/tclUnixThrd.c | 25 |
2 files changed, 35 insertions, 11 deletions
diff --git a/unix/tclUnixNotfy.c b/unix/tclUnixNotfy.c index 1457890..ca6a7ef 100644 --- a/unix/tclUnixNotfy.c +++ b/unix/tclUnixNotfy.c @@ -152,7 +152,6 @@ static int triggerPipe = -1; * The notifierMutex locks access to all of the global notifier state. */ -pthread_mutex_t notifierInitMutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t notifierMutex = PTHREAD_MUTEX_INITIALIZER; /* * The following static indicates if the notifier thread is running. @@ -281,7 +280,7 @@ static void StartNotifierThread(const char *proc) { if (!notifierThreadRunning) { - pthread_mutex_lock(¬ifierInitMutex); + TclpMasterLock(); if (!notifierThreadRunning) { if (TclpThreadCreate(¬ifierThread, NotifierThreadProc, NULL, TCL_THREAD_STACK_DEFAULT, TCL_THREAD_JOINABLE) != TCL_OK) { @@ -300,7 +299,7 @@ StartNotifierThread(const char *proc) notifierThreadRunning = 1; } - pthread_mutex_unlock(¬ifierInitMutex); + TclpMasterUnlock(); } } #endif /* TCL_THREADS */ @@ -362,7 +361,7 @@ Tcl_InitNotifier(void) tsdPtr->waitCVinitialized = 1; } - pthread_mutex_lock(¬ifierInitMutex); + TclpMasterLock(); #if defined(HAVE_PTHREAD_ATFORK) /* * Install pthread_atfork handlers to clean up the notifier in the @@ -381,7 +380,7 @@ Tcl_InitNotifier(void) notifierCount++; - pthread_mutex_unlock(¬ifierInitMutex); + TclpMasterUnlock(); #endif /* TCL_THREADS */ return tsdPtr; @@ -417,7 +416,7 @@ Tcl_FinalizeNotifier( #ifdef TCL_THREADS ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); - pthread_mutex_lock(¬ifierInitMutex); + TclpMasterLock(); notifierCount--; /* @@ -462,7 +461,7 @@ Tcl_FinalizeNotifier( #endif /* __CYGWIN__ */ tsdPtr->waitCVinitialized = 0; - pthread_mutex_unlock(¬ifierInitMutex); + TclpMasterUnlock(); #endif /* TCL_THREADS */ } } @@ -1368,7 +1367,7 @@ static void AtForkPrepare(void) { #if RESET_ATFORK_MUTEX == 0 - pthread_mutex_lock(¬ifierInitMutex); + TclpMasterLock(); #endif } @@ -1392,7 +1391,7 @@ static void AtForkParent(void) { #if RESET_ATFORK_MUTEX == 0 - pthread_mutex_unlock(¬ifierInitMutex); + TclpMasterUnlock(); #endif } @@ -1419,9 +1418,9 @@ AtForkChild(void) pthread_cond_destroy(¬ifierCV); } #if RESET_ATFORK_MUTEX == 0 - pthread_mutex_unlock(¬ifierInitMutex); + TclpMasterUnlock(); #else - pthread_mutex_init(¬ifierInitMutex, NULL); + TclpMasterReset(); pthread_mutex_init(¬ifierMutex, NULL); #endif pthread_cond_init(¬ifierCV, NULL); diff --git a/unix/tclUnixThrd.c b/unix/tclUnixThrd.c index 554a2dc..4130993 100644 --- a/unix/tclUnixThrd.c +++ b/unix/tclUnixThrd.c @@ -357,6 +357,31 @@ TclpMasterUnlock(void) /* *---------------------------------------------------------------------- * + * TclpMasterReset + * + * This procedure is used to reset a lock that serializes creation and + * finalization of synchronization objects. + * + * Results: + * None. + * + * Side effects: + * Reset the master mutex. + * + *---------------------------------------------------------------------- + */ + +void +TclpMasterReset(void) +{ +#ifdef TCL_THREADS + pthread_mutex_init(&masterLock, NULL); +#endif +} + +/* + *---------------------------------------------------------------------- + * * Tcl_GetAllocMutex * * This procedure returns a pointer to a statically initialized mutex for |