diff options
author | das <das> | 2009-04-10 20:46:21 (GMT) |
---|---|---|
committer | das <das> | 2009-04-10 20:46:21 (GMT) |
commit | dd6bcc6bb3edd682d8ecd29b6c8e1ac5cf459d01 (patch) | |
tree | 23d5bf7192417f028e9e377d4c5817f7c27231eb /unix | |
parent | 85c2084bc56dd2b7a1e758e8b11cf77f034724b8 (diff) | |
download | tcl-dd6bcc6bb3edd682d8ecd29b6c8e1ac5cf459d01.zip tcl-dd6bcc6bb3edd682d8ecd29b6c8e1ac5cf459d01.tar.gz tcl-dd6bcc6bb3edd682d8ecd29b6c8e1ac5cf459d01.tar.bz2 |
* unix/tclUnixChan.c: TclUnixWaitForFile(): use FD_* macros
* macosx/tclMacOSXNotify.c: to manipulate select masks (Cassoff).
[Bug 1960647]
Diffstat (limited to 'unix')
-rw-r--r-- | unix/tclUnixChan.c | 65 |
1 files changed, 31 insertions, 34 deletions
diff --git a/unix/tclUnixChan.c b/unix/tclUnixChan.c index cb3ba17..a915d5f 100644 --- a/unix/tclUnixChan.c +++ b/unix/tclUnixChan.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: tclUnixChan.c,v 1.93.2.1 2009/04/10 18:02:42 das Exp $ + * RCS: @(#) $Id: tclUnixChan.c,v 1.93.2.2 2009/04/10 20:46:21 das Exp $ */ #include "tclInt.h" /* Internal definitions for Tcl. */ @@ -3025,12 +3025,21 @@ TclUnixWaitForFile( { Tcl_Time abortTime = {0, 0}, now; /* silence gcc 4 warning */ struct timeval blockTime, *timeoutPtr; - int index, numFound, result = 0; - fd_mask bit; - fd_mask readyMasks[3*MASK_SIZE]; - fd_mask *maskp[3]; /* This array reflects the readable/writable - * conditions that were found to exist by the - * last call to select. */ + int numFound, result = 0; + fd_set readableMask; + fd_set writableMask; + fd_set exceptionalMask; + +#ifndef _DARWIN_C_SOURCE + /* + * Sanity check fd. + */ + + if (fd >= FD_SETSIZE) { + Tcl_Panic("TclUnixWaitForFile can't handle file id %d", fd); + /* must never get here, or select masks overrun will occur below */ + } +#endif /* * If there is a non-zero finite timeout, compute the time when we give @@ -3055,16 +3064,12 @@ TclUnixWaitForFile( } /* - * Initialize the ready masks and compute the mask offsets. + * Initialize the select masks. */ - if (fd >= FD_SETSIZE) { - Tcl_Panic("TclWaitForFile can't handle file id %d", fd); - /* must never get here, or readyMasks overrun will occur below */ - } - memset(readyMasks, 0, 3*MASK_SIZE*sizeof(fd_mask)); - index = fd / (NBBY*sizeof(fd_mask)); - bit = ((fd_mask)1) << (fd % (NBBY*sizeof(fd_mask))); + FD_ZERO(&readableMask); + FD_ZERO(&writableMask); + FD_ZERO(&exceptionalMask); /* * Loop in a mini-event loop of our own, waiting for either the file to @@ -3086,41 +3091,33 @@ TclUnixWaitForFile( } /* - * Set the appropriate bit in the ready masks for the fd. + * Setup the select masks for the fd. */ - if (mask & TCL_READABLE) { - readyMasks[index] |= bit; + if (mask & TCL_READABLE) { + FD_SET(fd, &readableMask); } - if (mask & TCL_WRITABLE) { - (readyMasks+MASK_SIZE)[index] |= bit; + if (mask & TCL_WRITABLE) { + FD_SET(fd, &writableMask); } if (mask & TCL_EXCEPTION) { - (readyMasks+2*(MASK_SIZE))[index] |= bit; + FD_SET(fd, &exceptionalMask); } /* * Wait for the event or a timeout. */ - /* - * This is needed to satisfy GCC 3.3's strict aliasing rules. - */ - - maskp[0] = &readyMasks[0]; - maskp[1] = &readyMasks[MASK_SIZE]; - maskp[2] = &readyMasks[2*MASK_SIZE]; - numFound = select(fd+1, (SELECT_MASK *) maskp[0], - (SELECT_MASK *) maskp[1], - (SELECT_MASK *) maskp[2], timeoutPtr); + numFound = select(fd + 1, &readableMask, &writableMask, + &exceptionalMask, timeoutPtr); if (numFound == 1) { - if (readyMasks[index] & bit) { + if (FD_ISSET(fd, &readableMask)) { SET_BITS(result, TCL_READABLE); } - if ((readyMasks+MASK_SIZE)[index] & bit) { + if (FD_ISSET(fd, &writableMask)) { SET_BITS(result, TCL_WRITABLE); } - if ((readyMasks+2*(MASK_SIZE))[index] & bit) { + if (FD_ISSET(fd, &exceptionalMask)) { SET_BITS(result, TCL_EXCEPTION); } result &= mask; |