diff options
| -rw-r--r-- | ChangeLog | 5 | ||||
| -rw-r--r-- | generic/tclIO.c | 15 | 
2 files changed, 15 insertions, 5 deletions
@@ -1,3 +1,8 @@ +2005-11-18  Jeff Hobbs  <jeffh@ActiveState.com> + +	* generic/tclIO.c (TclFinalizeIOSubsystem): preserve statePtr +	until we netrieve next statePtr from it. +  2005-11-18  Miguel Sofer <msofer@users.sf.net>  	* generic/tclObj.c (GetBignumFromObj): replace NULL with diff --git a/generic/tclIO.c b/generic/tclIO.c index 606ec75..f77a1a4 100644 --- a/generic/tclIO.c +++ b/generic/tclIO.c @@ -10,7 +10,7 @@   * See the file "license.terms" for information on usage and redistribution of   * this file, and for a DISCLAIMER OF ALL WARRANTIES.   * - * RCS: @(#) $Id: tclIO.c,v 1.101 2005/11/18 17:15:57 andreas_kupries Exp $ + * RCS: @(#) $Id: tclIO.c,v 1.102 2005/11/18 19:38:38 hobbs Exp $   */  #include "tclInt.h" @@ -180,7 +180,7 @@ TclFinalizeIOSubsystem(void)      ChannelState *statePtr;	/* state of channel stack */      for (statePtr = tsdPtr->firstCSPtr; statePtr != NULL; -	    statePtr = nextCSPtr) { +	 statePtr = nextCSPtr) {  	chanPtr = statePtr->topChanPtr;  	/* @@ -202,6 +202,11 @@ TclFinalizeIOSubsystem(void)  	    statePtr->refCount--;  	} +	/* +	 * Preserve statePtr from disappearing until we can get the +	 * nextCSPtr below. +	 */ +	Tcl_Preserve(statePtr);  	if (statePtr->refCount <= 0) {  	    /*  	     * Close it only if the refcount indicates that the channel is not @@ -210,7 +215,6 @@ TclFinalizeIOSubsystem(void)  	     */  	    (void) Tcl_Close(NULL, (Tcl_Channel) chanPtr); -  	} else {  	    /*  	     * The refcount is greater than zero, so flush the channel. @@ -240,10 +244,11 @@ TclFinalizeIOSubsystem(void)  	    statePtr->flags |= CHANNEL_DEAD;  	}  	/* -	 * We look for the next pointer now in case we had one closed on up during -	 * the current channel's closeproc. (eg: rechan extension). [PT] +	 * We look for the next pointer now in case we had one closed on up +	 * during the current channel's closeproc (eg: rechan extension)  	 */  	nextCSPtr = statePtr->nextCSPtr; +	Tcl_Release(statePtr);      }      TclpFinalizePipes();  }  | 
