summaryrefslogtreecommitdiffstats
path: root/generic/tclIORChan.c
diff options
context:
space:
mode:
authorandreas_kupries <andreas_kupries@noemail.net>2009-01-22 00:05:12 (GMT)
committerandreas_kupries <andreas_kupries@noemail.net>2009-01-22 00:05:12 (GMT)
commit4901b8fc62be67d714c2889df4e2a5993549f647 (patch)
tree8097c6a97e5860763fd734684b098838804ea789 /generic/tclIORChan.c
parentbd2d82ce68739345a9e9208d831eb4fc90e5b562 (diff)
downloadtcl-4901b8fc62be67d714c2889df4e2a5993549f647.zip
tcl-4901b8fc62be67d714c2889df4e2a5993549f647.tar.gz
tcl-4901b8fc62be67d714c2889df4e2a5993549f647.tar.bz2
* generic/tclIORChan.c (ReflectClose): Fix for [Bug 2458202].
Closing a channel may supply NULL for the 'interp'. Test for finalization needs to be different, and one place has to pull the interp out of the channel instead. FossilOrigin-Name: 68c5f6b5791c2ad7c6167ab6b4152f1de9d69c47
Diffstat (limited to 'generic/tclIORChan.c')
-rw-r--r--generic/tclIORChan.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/generic/tclIORChan.c b/generic/tclIORChan.c
index d13b9aac..c9a294b 100644
--- a/generic/tclIORChan.c
+++ b/generic/tclIORChan.c
@@ -15,7 +15,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclIORChan.c,v 1.28.2.5 2008/07/03 17:38:18 andreas_kupries Exp $
+ * RCS: @(#) $Id: tclIORChan.c,v 1.28.2.6 2009/01/22 00:05:14 andreas_kupries Exp $
*/
#include <tclInt.h>
@@ -1046,7 +1046,7 @@ ReflectClose(
ReflectedChannelMap* rcmPtr; /* Map of reflected channels with handlers in this interp */
Tcl_HashEntry* hPtr; /* Entry in the above map */
- if (interp == NULL) {
+ if (TclInThreadExit()) {
/*
* This call comes from TclFinalizeIOSystem. There are no
* interpreters, and therefore we cannot call upon the handler command
@@ -1134,13 +1134,18 @@ ReflectClose(
* NOTE: The channel may not be in the map. This is ok, that happens
* when the channel was created in a different interpreter and/or
* thread and then was moved here.
+ *
+ * NOTE: The channel may have been removed from the map already via
+ * the per-interp DeleteReflectedChannelMap exit-handler.
*/
-
- rcmPtr = GetReflectedChannelMap (interp);
- hPtr = Tcl_FindHashEntry (&rcmPtr->map,
- Tcl_GetChannelName (rcPtr->chan));
- if (hPtr) {
- Tcl_DeleteHashEntry (hPtr);
+
+ if (rcPtr->interp) {
+ rcmPtr = GetReflectedChannelMap (rcPtr->interp);
+ hPtr = Tcl_FindHashEntry (&rcmPtr->map,
+ Tcl_GetChannelName (rcPtr->chan));
+ if (hPtr) {
+ Tcl_DeleteHashEntry (hPtr);
+ }
}
#ifdef TCL_THREADS
rcmPtr = GetThreadReflectedChannelMap();