summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorvasiljevic <zv@archiware.com>2004-07-15 20:04:37 (GMT)
committervasiljevic <zv@archiware.com>2004-07-15 20:04:37 (GMT)
commit9d7f713f586c81f1d0d0632785099ab9d6b852e1 (patch)
treecda637381493aaa8fd7374f0ce8fa0286d5c8da4 /generic
parent795721e7172e3fe72dc211f941a7519df12958b6 (diff)
downloadtcl-9d7f713f586c81f1d0d0632785099ab9d6b852e1.zip
tcl-9d7f713f586c81f1d0d0632785099ab9d6b852e1.tar.gz
tcl-9d7f713f586c81f1d0d0632785099ab9d6b852e1.tar.bz2
Stuffed memory leak incurred by re-initializing of TSD slots
after the last call to TclFinalizeThreadData (done from within Tcl_FinalizeThread()). We basically just repeat the TclFinalizeThreadData() once more before tearing down TSD keys in TclFinalizeSynchronization(). There should be more elaborate mechanism in place for handling such issues, based on thread cleanup handlers registered on the OS level. Such change requires much more work and would also require TIP because some visible parts of Tcl API would have to be modified. In the meantime, this will do.
Diffstat (limited to 'generic')
-rw-r--r--generic/tclEvent.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/generic/tclEvent.c b/generic/tclEvent.c
index 2abd239..b169196 100644
--- a/generic/tclEvent.c
+++ b/generic/tclEvent.c
@@ -12,7 +12,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclEvent.c,v 1.42 2004/07/15 10:00:45 vasiljevic Exp $
+ * RCS: @(#) $Id: tclEvent.c,v 1.43 2004/07/15 20:04:38 vasiljevic Exp $
*/
#include "tclInt.h"
@@ -933,10 +933,23 @@ Tcl_Finalize()
Tcl_SetPanicProc(NULL);
/*
+ * Repeat finalization of the thread local storage once more.
+ * Although this step is already done by the Tcl_FinalizeThread
+ * call above, series of events happening afterwards may
+ * re-initialize TSD slots. Those need to be finalized again,
+ * otherwise we're leaking memory chunks.
+ * Very important to note is that things happening afterwards
+ * should not reference anything which may re-initialize TSD's.
+ * This includes freeing Tcl_Objs's, among other things.
+ *
+ * This fixes the Tcl Bug #990552.
+ */
+ TclFinalizeThreadData();
+
+ /*
* Free synchronization objects. There really should only be one
* thread alive at this moment.
*/
-
TclFinalizeSynchronization();
/*
@@ -1021,17 +1034,17 @@ Tcl_FinalizeThread()
TclFinalizeAsync();
}
- /*
- * Blow away all thread local storage blocks.
+ /*
+ * Blow away all thread local storage blocks.
*
* Note that Tcl API allows creation of threads which do not use any
* Tcl interp or other Tcl subsytems. Those threads might, however,
* use thread local storage, so we must unconditionally finalize it.
*
* Fix [Bug #571002]
- */
+ */
- TclFinalizeThreadData();
+ TclFinalizeThreadData();
}
/*