From: Jim Barton <j...@network-age.com>
Subject: Bug in TCL 7.6 on Windows Sockets
Date: 1996/10/28
Message-ID: <32754000.3241@network-age.com>#1/1
X-Deja-AN: 192887544
cc: maydw...@bayarea.net
content-type: text/plain; charset=us-ascii
organization: Network Age Software, Inc.
mime-version: 1.0
reply-to: j...@network-age.com
newsgroups: comp.lang.tcl
x-mailer: Mozilla 3.0Gold (Win95; I)


In file win/tclWinSock.c, routine TcpAccept(). Function is
called when a connection attempt is made on a server socket
in order to accept the connection and open a new socket.

Near the beginning of the routine, after calling the Windows
hook for accepting the socket, he wants to clear the TCL_READABLE
condition for the accepting socket. Code reads:

	infoPtr->flags= (~(TCL_READABLE));

This certainly clears the flag, but sets every other bit in the word.

The manifestation of this problem is that once a program accepts it's
first connection, the accept socket flags indicate various
strange conditions which never get cleared. The TCL program
never blocks, as higher level code thinks there
is an event to handle, while low-level code doesn't. A very nice
CPU cycle soaker indeed.

The fix is trivial:

	infoPtr->flags &= ~TCL_READABLE;

which is probably what was meant in the first place.

-- Jim Barton

From: Jim Barton <j...@network-age.com>
Subject: BUG in tk4.2 on Windows - bad library search path
Date: 1996/11/14
Message-ID: <328BA3D2.9B6@network-age.com>#1/1
X-Deja-AN: 196524572
content-type: text/plain; charset=us-ascii
organization: Network Age Software, Inc.
mime-version: 1.0
reply-to: j...@network-age.com
newsgroups: comp.lang.tcl
x-mailer: Mozilla 3.0Gold (Win95; I)


There is a bug in tk4.2 under Windows in finding the path for the
library
scripts. Consider the following fragment from the file win/tkWinInit.c:

| static char *initScript =
| "proc init {} {\n\
|     global tk_library tk_version tk_patchLevel env\n\
|     rename init {}\n\
|     set dirs {}\n\
|     if [info exists env(TK_LIBRARY)] {\n\
|       lappend dirs $env(TK_LIBRARY)\n\
|     }\n\
|     lappend dirs $tk_library\n\
|     lappend dirs [file dirname [info library]]/lib/tk$tk_version\n\
                                                ^^^^
                This code is wrong; the 'lib' will be left on the end
                after stripping the terminal tcl7.6 library off, and
thus
                the script will look in .../lib/lib/tk$tkversion.

|     lappend dirs [file dirname [file dirname [info
nameofexecutable]]]/lib/tk$tk_version\n\
|     if [string match {*[ab]*} $tk_patchLevel] {\n\
|       set lib tk$tk_patchLevel\n\
|     } else {\n\
|       set lib tk$tk_version\n\
| ...

The search works because the next element strips the executable path
*and*
the 'bin' directory first, so you never see the bug if you run wish42
out
of the standard place ... but if you, for instance, copy it and run it
from somewhere else, blammo. This is a pain if you roll your own wish's.

-- jmb