On Sun 64 platforms the math for calculating the fd_set
bit is wrong.
tclUnixNotfy.c:443
bit = 1 << (fd%(NBBY*sizeof(fd_mask)));
sizeof(fd_mask) is 8, but sizeof(1) is 4. The easiest
fix for this is to change bit && "1" to unsigned long.
Note: this code pattern is copy/pasted throughout this
file, and all places need to be fixed. However, out of
curiosity, why aren't we using FD_SET/ISSET etc?
Logged In: YES
user_id=99768
The fact that we don't use FD_SET/FD_ISSET is
quite an archaeism. At the time the code was
written, there were still a fair number of non-POSIX
operating systems out there that didn't have
the FD_ macros.
I'll have a look at this. FD_SET and FD_ISSET are
clearly preferable if they work everywhere now
(as I believe they do).
Logged In: YES
user_id=99768
On reading the code, it appears that the lack of
FD_SET/FD_ISSET is
a misguided attempt at performance enhancement, when the select
masks from the subthreads are OR-ed together to form the select
mask of the Notifier thread. While the FD_* code is ugly,
it looks to
be The Right Thing moving forward, at least until poll() is
ubiquitous
(or we introduce a compat/ version of it). The HEAD and the
tip of
the 8.4 branch now use the FD_* macros.