diff options
author | dgp <dgp@users.sourceforge.net> | 2003-03-21 03:24:08 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2003-03-21 03:24:08 (GMT) |
commit | 7397eb21b5546e2f2db642b3a7fda20d24bfd70b (patch) | |
tree | f4ee1218e335a50e9e0bf7a9228ad49a9ba38649 /unix | |
parent | 3e6b1cd7c58db82bcfccf38659be021a9fc2e816 (diff) | |
download | tcl-7397eb21b5546e2f2db642b3a7fda20d24bfd70b.zip tcl-7397eb21b5546e2f2db642b3a7fda20d24bfd70b.tar.gz tcl-7397eb21b5546e2f2db642b3a7fda20d24bfd70b.tar.bz2 |
* generic/tclInt.h (tclOriginalNotifier):
* generic/tclStubInit.c (tclOriginalNotifier):
* mac/tclMacNotify.c (Tcl_SetTimer,Tcl_WaitForEvent):
* unix/tclUnixNotfy.c (Tcl_SetTimer,Tcl_WaitForEvent,
Tcl_CreateFileHandler,Tcl_DeleteFileHandler):
* win/tclWinNotify.c (Tcl_SetTimer,Tcl_WaitForEvent): Some linkers
apparently use a different representation for a pointer to a function
within the same compilation unit and a pointer to a function in a
different compilation unit. This causes checks like those in the
original notifier procedures to fall into infinite loops. The fix
is to store pointers to the original notifier procedures in a struct
defined in the same compilation unit as the stubs tables, and compare
against those values. [Bug 707174]
Diffstat (limited to 'unix')
-rw-r--r-- | unix/tclUnixNotfy.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/unix/tclUnixNotfy.c b/unix/tclUnixNotfy.c index 94be5a0..7de3417 100644 --- a/unix/tclUnixNotfy.c +++ b/unix/tclUnixNotfy.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclUnixNotfy.c,v 1.11 2002/08/31 06:09:46 das Exp $ + * RCS: @(#) $Id: tclUnixNotfy.c,v 1.11.2.1 2003/03/21 03:24:09 dgp Exp $ */ #include "tclInt.h" @@ -19,6 +19,7 @@ #include <signal.h> extern TclStubs tclStubs; +extern Tcl_NotifierProcs tclOriginalNotifier; /* * This structure is used to keep track of the notifier info for a @@ -353,7 +354,7 @@ Tcl_SetTimer(timePtr) * timeout values to Tcl_WaitForEvent. */ - if (tclStubs.tcl_SetTimer != Tcl_SetTimer) { + if (tclStubs.tcl_SetTimer != tclOriginalNotifier.setTimerProc) { tclStubs.tcl_SetTimer(timePtr); } } @@ -412,7 +413,7 @@ Tcl_CreateFileHandler(fd, mask, proc, clientData) FileHandler *filePtr; int index, bit; - if (tclStubs.tcl_CreateFileHandler != Tcl_CreateFileHandler) { + if (tclStubs.tcl_CreateFileHandler != tclOriginalNotifier.createFileHandlerProc) { tclStubs.tcl_CreateFileHandler(fd, mask, proc, clientData); return; } @@ -486,7 +487,7 @@ Tcl_DeleteFileHandler(fd) unsigned long flags; ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); - if (tclStubs.tcl_DeleteFileHandler != Tcl_DeleteFileHandler) { + if (tclStubs.tcl_DeleteFileHandler != tclOriginalNotifier.deleteFileHandlerProc) { tclStubs.tcl_DeleteFileHandler(fd); return; } @@ -662,7 +663,7 @@ Tcl_WaitForEvent(timePtr) #endif ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); - if (tclStubs.tcl_WaitForEvent != Tcl_WaitForEvent) { + if (tclStubs.tcl_WaitForEvent != tclOriginalNotifier.waitForEventProc) { return tclStubs.tcl_WaitForEvent(timePtr); } |