summaryrefslogtreecommitdiffstats
path: root/win
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2003-03-21 03:23:23 (GMT)
committerdgp <dgp@users.sourceforge.net>2003-03-21 03:23:23 (GMT)
commita0ed5880ee97954af162748411d3a6e692b29d7f (patch)
tree0c5cc36fcf18b16e588c47d9dee6ca5fd1a68dbc /win
parent4ade466c44615be091e19c177e11eef5524163c4 (diff)
downloadtcl-a0ed5880ee97954af162748411d3a6e692b29d7f.zip
tcl-a0ed5880ee97954af162748411d3a6e692b29d7f.tar.gz
tcl-a0ed5880ee97954af162748411d3a6e692b29d7f.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 'win')
-rw-r--r--win/tclWinNotify.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/win/tclWinNotify.c b/win/tclWinNotify.c
index b7bb17d..8cf4c4c 100644
--- a/win/tclWinNotify.c
+++ b/win/tclWinNotify.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: tclWinNotify.c,v 1.11 2003/01/16 19:02:00 mdejong Exp $
+ * RCS: @(#) $Id: tclWinNotify.c,v 1.12 2003/03/21 03:23:24 dgp Exp $
*/
#include "tclWinInt.h"
@@ -45,6 +45,8 @@ typedef struct ThreadSpecificData {
static Tcl_ThreadDataKey dataKey;
extern TclStubs tclStubs;
+extern Tcl_NotifierProcs tclOriginalNotifier;
+
/*
* The following static indicates the number of threads that have
* initialized notifiers. It controls the lifetime of the TclNotifier
@@ -267,7 +269,7 @@ Tcl_SetTimer(
* on Windows, but mirrors the UNIX hook.
*/
- if (tclStubs.tcl_SetTimer != Tcl_SetTimer) {
+ if (tclStubs.tcl_SetTimer != tclOriginalNotifier.setTimerProc) {
tclStubs.tcl_SetTimer(timePtr);
return;
}
@@ -433,7 +435,7 @@ Tcl_WaitForEvent(
* sense on windows, but mirrors the UNIX hook.
*/
- if (tclStubs.tcl_WaitForEvent != Tcl_WaitForEvent) {
+ if (tclStubs.tcl_WaitForEvent != tclOriginalNotifier.waitForEventProc) {
return tclStubs.tcl_WaitForEvent(timePtr);
}