summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorvasiljevic <vasiljevic@noemail.net>2004-07-15 21:20:23 (GMT)
committervasiljevic <vasiljevic@noemail.net>2004-07-15 21:20:23 (GMT)
commit0037a74d59b71c12c2470e0016f77bb704aea64d (patch)
tree406f4edeca9bed43cc97046d91419f648b9602d4 /generic
parent79f72560e381793712dfb3e1962527bb3295805d (diff)
downloadtcl-0037a74d59b71c12c2470e0016f77bb704aea64d.zip
tcl-0037a74d59b71c12c2470e0016f77bb704aea64d.tar.gz
tcl-0037a74d59b71c12c2470e0016f77bb704aea64d.tar.bz2
Added new fix for the Tcl Bug #770053. Now we conditionaly perform
the TclFinalizeNotifier in order to correct broken ref-counting of the notifier thread. FossilOrigin-Name: 9ed2ecf6265bbed6708e19e970a556d3556afb95
Diffstat (limited to 'generic')
-rw-r--r--generic/tclNotify.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/generic/tclNotify.c b/generic/tclNotify.c
index d312e6c..abd4e04 100644
--- a/generic/tclNotify.c
+++ b/generic/tclNotify.c
@@ -14,7 +14,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclNotify.c,v 1.11 2003/02/15 20:24:10 kennykb Exp $
+ * RCS: @(#) $Id: tclNotify.c,v 1.11.2.1 2004/07/15 21:20:25 vasiljevic Exp $
*/
#include "tclInt.h"
@@ -137,7 +137,15 @@ TclInitNotifier()
*
* Side effects:
* Removes the notifier associated with the current thread from
- * the global notifier list.
+ * the global notifier list. This is done only if the notifier
+ * was initialized for this thread by call to TclInitNotifier().
+ * This is always true for threads which have been seeded with
+ * an Tcl interpreter, since the call to Tcl_CreateInterp will,
+ * among other things, call TclInitializeSubsystems() and this
+ * one will, in turn, call the TclInitNotifier() for the thread.
+ * For threads created without the Tcl interpreter, though,
+ * nobody is explicitly nor implicitly calling the TclInitNotifier
+ * hence, TclFinalizeNotifier should not be performed at all.
*
*----------------------------------------------------------------------
*/
@@ -149,6 +157,10 @@ TclFinalizeNotifier()
ThreadSpecificData **prevPtrPtr;
Tcl_Event *evPtr, *hold;
+ if (tsdPtr->threadId == (Tcl_ThreadId)0) {
+ return; /* Notifier not initialized for the current thread */
+ }
+
Tcl_MutexLock(&(tsdPtr->queueMutex));
for (evPtr = tsdPtr->firstEventPtr; evPtr != (Tcl_Event *) NULL; ) {
hold = evPtr;