diff options
| author | das <das> | 2009-04-10 20:46:01 (GMT) | 
|---|---|---|
| committer | das <das> | 2009-04-10 20:46:01 (GMT) | 
| commit | bd0c824cbd2ddcd1696ab853ba64a33290bd62da (patch) | |
| tree | d0a79fd2ddd2978c81d4da56caf93dd6caf63b86 /unix/tclUnixChan.c | |
| parent | a9bb49b48e59b917e2493b99426057fdf9484e35 (diff) | |
| download | tcl-bd0c824cbd2ddcd1696ab853ba64a33290bd62da.zip tcl-bd0c824cbd2ddcd1696ab853ba64a33290bd62da.tar.gz tcl-bd0c824cbd2ddcd1696ab853ba64a33290bd62da.tar.bz2 | |
	* unix/tclUnixChan.c:		TclUnixWaitForFile(): use FD_* macros
	* macosx/tclMacOSXNotify.c:	to manipulate select masks (Cassoff).
					[Bug 1960647]
Diffstat (limited to 'unix/tclUnixChan.c')
| -rw-r--r-- | unix/tclUnixChan.c | 63 | 
1 files changed, 30 insertions, 33 deletions
| diff --git a/unix/tclUnixChan.c b/unix/tclUnixChan.c index 18faa99..47cba16 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.98 2009/04/10 18:02:37 das Exp $ + * RCS: @(#) $Id: tclUnixChan.c,v 1.99 2009/04/10 20:46:01 das Exp $   */  #include "tclInt.h"	/* Internal definitions for Tcl. */ @@ -3052,11 +3052,20 @@ 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. */ +    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 @@ -3081,16 +3090,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 @@ -3112,41 +3117,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; | 
