diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | macosx/tclMacOSXNotify.c | 65 | ||||
-rw-r--r-- | unix/tclUnixChan.c | 65 |
3 files changed, 66 insertions, 68 deletions
@@ -18,6 +18,10 @@ 2008-04-10 Daniel Steffen <das@users.sourceforge.net> + * unix/tclUnixChan.c: TclUnixWaitForFile(): use FD_* macros + * macosx/tclMacOSXNotify.c: to manipulate select masks (Cassoff). + [Bug 1960647] + * unix/tclLoadDyld.c: use RTLD_GLOBAL instead of RTLD_LOCAL. [Bug 1961211] diff --git a/macosx/tclMacOSXNotify.c b/macosx/tclMacOSXNotify.c index a45741d..88a4f88 100644 --- a/macosx/tclMacOSXNotify.c +++ b/macosx/tclMacOSXNotify.c @@ -12,7 +12,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclMacOSXNotify.c,v 1.18.2.1 2009/04/10 18:02:42 das Exp $ + * RCS: @(#) $Id: tclMacOSXNotify.c,v 1.18.2.2 2009/04/10 20:46:21 das Exp $ */ #include "tclInt.h" @@ -1544,16 +1544,25 @@ 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; #define SET_BITS(var, bits) ((var) |= (bits)) #define CLEAR_BITS(var, bits) ((var) &= ~(bits)) +#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 * up. @@ -1577,16 +1586,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 @@ -1608,41 +1613,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; 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; |