summaryrefslogtreecommitdiffstats
path: root/unix
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2003-03-21 03:24:08 (GMT)
committerdgp <dgp@users.sourceforge.net>2003-03-21 03:24:08 (GMT)
commit7397eb21b5546e2f2db642b3a7fda20d24bfd70b (patch)
treef4ee1218e335a50e9e0bf7a9228ad49a9ba38649 /unix
parent3e6b1cd7c58db82bcfccf38659be021a9fc2e816 (diff)
downloadtcl-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.c11
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);
}