From 1ed4bd550b5b14493cf7673adfc2657f1e70bbfd Mon Sep 17 00:00:00 2001 From: dgp Date: Mon, 20 Mar 2006 22:58:45 +0000 Subject: * generic/tkConsole.c: Added exit handler to clean up the interp where the console window lives. --- ChangeLog | 5 +++++ generic/tkConsole.c | 32 +++++++++++++++++++++++++++----- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index b20829a..04bd1b8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-03-20 Don Porter + + * generic/tkConsole.c: Added exit handler to clean up the interp + where the console window lives. + 2006-03-18 Vince Darley * generic/tkText.c: fix for undo/modified status of text diff --git a/generic/tkConsole.c b/generic/tkConsole.c index b3bd182..f43ad31 100644 --- a/generic/tkConsole.c +++ b/generic/tkConsole.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: tkConsole.c,v 1.27 2006/03/16 22:51:15 dgp Exp $ + * RCS: @(#) $Id: tkConsole.c,v 1.28 2006/03/20 22:58:46 dgp Exp $ */ #include "tk.h" @@ -57,6 +57,7 @@ static int ConsoleObjCmd(ClientData clientData, Tcl_Interp *interp, static int ConsoleOutput(ClientData instanceData, CONST char *buf, int toWrite, int *errorCode); static void ConsoleWatch(ClientData instanceData, int mask); +static void DeleteConsoleInterp(ClientData clientData); static void InterpDeleteProc(ClientData clientData, Tcl_Interp *interp); static int InterpreterObjCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); @@ -200,8 +201,8 @@ ShouldUseConsoleChannel( * Tk_InitConsoleChannels -- * * Create the console channels and install them as the standard channels. - * All I/O will be discarded until TkConsoleInit is called to attach the - * console to a text widget. + * All I/O will be discarded until Tk_CreateConsoleWindow is called to + * attach the console to a text widget. * * Results: * None. @@ -387,10 +388,10 @@ Tk_CreateConsoleWindow( info->consoleInterp = consoleInterp; info->interp = interp; - /* TODO: establish exit handler for cleanup */ - Tcl_CallWhenDeleted(consoleInterp, InterpDeleteProc, (ClientData) info); info->refCount++; + Tcl_CreateThreadExitHandler(DeleteConsoleInterp, + (ClientData) consoleInterp); /* * Add console commands to the interp @@ -781,6 +782,25 @@ InterpreterObjCmd( /* *---------------------------------------------------------------------- * + * DeleteConsoleInterp -- + * + * Thread exit handler to destroy a console interp when the + * thread it lives in gets torn down. + * + *---------------------------------------------------------------------- + */ + +static void +DeleteConsoleInterp( + ClientData clientData) +{ + Tcl_Interp *interp = (Tcl_Interp *)clientData; + Tcl_DeleteInterp(interp); +} + +/* + *---------------------------------------------------------------------- + * * InterpDeleteProc -- * * React when the interp in which the console is displayed is deleted @@ -803,6 +823,8 @@ InterpDeleteProc( ConsoleInfo *info = (ConsoleInfo *) clientData; if (info->consoleInterp == interp) { + Tcl_DeleteThreadExitHandler(DeleteConsoleInterp, + (ClientData) info->consoleInterp); info->consoleInterp = NULL; } if (--info->refCount <= 0) { -- cgit v0.12