Menu

#2974 select() loop notifys wrong fd's

obsolete: 8.4.8
closed-fixed
5
2004-11-24
2004-11-23
No

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?

Discussion

  • Kevin B KENNY

    Kevin B KENNY - 2004-11-23

    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).

     
  • Kevin B KENNY

    Kevin B KENNY - 2004-11-24

    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.

     
  • Kevin B KENNY

    Kevin B KENNY - 2004-11-24
    • status: open --> closed-fixed