Index: generic/tclEvent.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclEvent.c,v
retrieving revision 1.28.2.8
diff -u -r1.28.2.8 tclEvent.c
--- generic/tclEvent.c	21 Jul 2004 01:30:57 -0000	1.28.2.8
+++ generic/tclEvent.c	27 Jul 2004 23:57:59 -0000
@@ -783,6 +783,29 @@
 Tcl_Finalize()
 {
     ExitHandler *exitPtr;
+    
+    /*
+     * Invoke exit handlers first.
+     */
+
+    Tcl_MutexLock(&exitMutex);
+    inFinalize = 1;
+    for (exitPtr = firstExitPtr; exitPtr != NULL; exitPtr = firstExitPtr) {
+	/*
+	 * Be careful to remove the handler from the list before
+	 * invoking its callback.  This protects us against
+	 * double-freeing if the callback should call
+	 * Tcl_DeleteExitHandler on itself.
+	 */
+
+	firstExitPtr = exitPtr->nextPtr;
+	Tcl_MutexUnlock(&exitMutex);
+	(*exitPtr->proc)(exitPtr->clientData);
+	ckfree((char *) exitPtr);
+	Tcl_MutexLock(&exitMutex);
+    }    
+    firstExitPtr = NULL;
+    Tcl_MutexUnlock(&exitMutex);
 
     TclpInitLock();
     if (subsystemsInitialized != 0) {
@@ -796,29 +819,6 @@
 	(void) TCL_TSD_INIT(&dataKey);
 
 	/*
-	 * Invoke exit handlers first.
-	 */
-
-	Tcl_MutexLock(&exitMutex);
-	inFinalize = 1;
-	for (exitPtr = firstExitPtr; exitPtr != NULL; exitPtr = firstExitPtr) {
-	    /*
-	     * Be careful to remove the handler from the list before
-	     * invoking its callback.  This protects us against
-	     * double-freeing if the callback should call
-	     * Tcl_DeleteExitHandler on itself.
-	     */
-
-	    firstExitPtr = exitPtr->nextPtr;
-	    Tcl_MutexUnlock(&exitMutex);
-	    (*exitPtr->proc)(exitPtr->clientData);
-	    ckfree((char *) exitPtr);
-	    Tcl_MutexLock(&exitMutex);
-	}    
-	firstExitPtr = NULL;
-	Tcl_MutexUnlock(&exitMutex);
-
-	/*
 	 * Clean up after the current thread now, after exit handlers.
 	 * In particular, the testexithandler command sets up something
 	 * that writes to standard output, which gets closed.
