Blame lib/Xm/Xmpoll.h

Packit b099d7
/* $Xorg: Xpoll.h,v 1.3 2000/08/18 04:05:44 coskrey Exp $ */
Packit b099d7
Packit b099d7
/*
Packit b099d7
Packit b099d7
Copyright 1994, 1998  The Open Group
Packit b099d7
Packit b099d7
All Rights Reserved.
Packit b099d7
Packit b099d7
The above copyright notice and this permission notice shall be included
Packit b099d7
in all copies or substantial portions of the Software.
Packit b099d7
Packit b099d7
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Packit b099d7
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Packit b099d7
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Packit b099d7
IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
Packit b099d7
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
Packit b099d7
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
Packit b099d7
OTHER DEALINGS IN THE SOFTWARE.
Packit b099d7
Packit b099d7
Except as contained in this notice, the name of The Open Group shall
Packit b099d7
not be used in advertising or otherwise to promote the sale, use or
Packit b099d7
other dealings in this Software without prior written authorization
Packit b099d7
from The Open Group.
Packit b099d7
Packit b099d7
*/
Packit b099d7
/* $XFree86: xc/include/Xpoll.h,v 3.7 2000/09/19 12:46:05 eich Exp $ */
Packit b099d7
Packit b099d7
#ifndef _XPOLL_H_
Packit b099d7
#define _XPOLL_H_
Packit b099d7
Packit b099d7
#ifndef WIN32
Packit b099d7
Packit b099d7
#ifndef USE_POLL
Packit b099d7
Packit b099d7
#include <X11/Xos.h>
Packit b099d7
#if !defined(DGUX)
Packit b099d7
#if (defined(SVR4) || defined(CRAY) || defined(AIXV3)) && !defined(FD_SETSIZE)
Packit b099d7
#include <sys/select.h>
Packit b099d7
#ifdef luna
Packit b099d7
#include <sysent.h>
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
#else /* DGUX  -- No sys/select in Intel DG/ux */
Packit b099d7
#include <sys/time.h> 
Packit b099d7
#include <sys/types.h>
Packit b099d7
#include <unistd.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#ifdef __QNX__  /* Make sure we get 256 bit select masks */
Packit b099d7
#define FD_SETSIZE 256
Packit b099d7
#include <sys/select.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
/* AIX 4.2 fubar-ed <sys/select.h>, so go to heroic measures to get it */
Packit b099d7
#if defined(AIXV4) && !defined(NFDBITS)
Packit b099d7
#include <sys/select.h>
Packit b099d7
#endif
Packit b099d7
#include <X11/Xmd.h>
Packit b099d7
#ifdef CSRG_BASED
Packit b099d7
#include <sys/param.h>
Packit b099d7
# if BSD < 199103
Packit b099d7
typedef long fd_mask;
Packit b099d7
# endif
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#define XFD_SETSIZE	256
Packit b099d7
#ifndef FD_SETSIZE
Packit b099d7
#define FD_SETSIZE	XFD_SETSIZE
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#ifndef NBBY
Packit b099d7
#define NBBY	8		/* number of bits in a byte */
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#ifndef NFDBITS
Packit b099d7
#define NFDBITS (sizeof(fd_mask) * NBBY)	/* bits per mask */
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#ifndef howmany
Packit b099d7
#define howmany(x,y)	(((x)+((y)-1))/(y))
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#ifdef BSD
Packit b099d7
# if BSD < 198911	/* 198911 == OSF/1, 199103 == CSRG_BASED */
Packit b099d7
#  ifndef luna		/* and even though on LUNA BSD ==  43, it has it */
Packit b099d7
typedef struct fd_set {
Packit b099d7
	fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)];
Packit b099d7
} fd_set;
Packit b099d7
#  endif
Packit b099d7
# endif
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#ifndef hpux /* and perhaps old BSD ??? */
Packit b099d7
# define Select(n,r,w,e,t) select(n,(fd_set*)r,(fd_set*)w,(fd_set*)e,(struct timeval*)t)
Packit b099d7
#else
Packit b099d7
# ifndef _XPG4_EXTENDED /* HPUX 9.x and earlier */
Packit b099d7
#  define Select(n,r,w,e,t) select(n,(int*)r,(int*)w,(int*)e,(struct timeval*)t)
Packit b099d7
# else
Packit b099d7
#  define Select(n,r,w,e,t) select(n,(fd_set*)r,(fd_set*)w,(fd_set*)e,(struct timeval*)t)
Packit b099d7
# endif
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#ifndef FD_SET
Packit b099d7
#define FD_SET(n, p)    ((p)->fds_bits[(n)/NFDBITS] |= ((fd_mask)1 << ((n) % NFDBITS)))
Packit b099d7
#endif
Packit b099d7
#ifndef FD_CLR
Packit b099d7
#define FD_CLR(n, p)    ((p)->fds_bits[(n)/NFDBITS] &= ~((fd_mask)1 << ((n) % NFDBITS)))
Packit b099d7
#endif
Packit b099d7
#ifndef FD_ISSET
Packit b099d7
#define FD_ISSET(n, p)  ((p)->fds_bits[(n)/NFDBITS] & ((fd_mask)1 << ((n) % NFDBITS)))
Packit b099d7
#endif
Packit b099d7
#ifndef FD_ZERO
Packit b099d7
#define FD_ZERO(p)      bzero((char *)(p), sizeof(*(p)))
Packit b099d7
#endif
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * The following macros are used by the servers only. There is an
Packit b099d7
 * explicit assumption that the bit array in the fd_set is at least
Packit b099d7
 * 256 bits long (8 32-bit words). This is true on most modern POSIX 
Packit b099d7
 * systems. Note that this is merely an optimization for the servers
Packit b099d7
 * based on assumptions about the way that file descripters are
Packit b099d7
 * allocated on POSIX systems. 
Packit b099d7
 *
Packit b099d7
 * When porting X to new systems it is important to adjust these
Packit b099d7
 * macros if the system has fewer than 256 bits in the fd_set bit
Packit b099d7
 * array.
Packit b099d7
 */
Packit b099d7
#define XFD_ANYSET(p) \
Packit b099d7
		((p)->fds_bits[0] || (p)->fds_bits[1] || \
Packit b099d7
		(p)->fds_bits[2] || (p)->fds_bits[3] || \
Packit b099d7
		(p)->fds_bits[4] || (p)->fds_bits[5] || \
Packit b099d7
		(p)->fds_bits[6] || (p)->fds_bits[7])
Packit b099d7
Packit b099d7
#define XFD_COPYSET(src,dst) \
Packit b099d7
		(dst)->fds_bits[0] = (src)->fds_bits[0]; \
Packit b099d7
		(dst)->fds_bits[1] = (src)->fds_bits[1]; \
Packit b099d7
		(dst)->fds_bits[2] = (src)->fds_bits[2]; \
Packit b099d7
		(dst)->fds_bits[3] = (src)->fds_bits[3]; \
Packit b099d7
		(dst)->fds_bits[4] = (src)->fds_bits[4]; \
Packit b099d7
		(dst)->fds_bits[5] = (src)->fds_bits[5]; \
Packit b099d7
		(dst)->fds_bits[6] = (src)->fds_bits[6]; \
Packit b099d7
		(dst)->fds_bits[7] = (src)->fds_bits[7];
Packit b099d7
Packit b099d7
#define XFD_ANDSET(dst,b1,b2) \
Packit b099d7
		(dst)->fds_bits[0] = ((b1)->fds_bits[0] & (b2)->fds_bits[0]); \
Packit b099d7
		(dst)->fds_bits[1] = ((b1)->fds_bits[1] & (b2)->fds_bits[1]); \
Packit b099d7
		(dst)->fds_bits[2] = ((b1)->fds_bits[2] & (b2)->fds_bits[2]); \
Packit b099d7
		(dst)->fds_bits[3] = ((b1)->fds_bits[3] & (b2)->fds_bits[3]); \
Packit b099d7
		(dst)->fds_bits[4] = ((b1)->fds_bits[4] & (b2)->fds_bits[4]); \
Packit b099d7
		(dst)->fds_bits[5] = ((b1)->fds_bits[5] & (b2)->fds_bits[5]); \
Packit b099d7
		(dst)->fds_bits[6] = ((b1)->fds_bits[6] & (b2)->fds_bits[6]); \
Packit b099d7
		(dst)->fds_bits[7] = ((b1)->fds_bits[7] & (b2)->fds_bits[7]);
Packit b099d7
Packit b099d7
#define XFD_ORSET(dst,b1,b2) \
Packit b099d7
		(dst)->fds_bits[0] = ((b1)->fds_bits[0] | (b2)->fds_bits[0]); \
Packit b099d7
		(dst)->fds_bits[1] = ((b1)->fds_bits[1] | (b2)->fds_bits[1]); \
Packit b099d7
		(dst)->fds_bits[2] = ((b1)->fds_bits[2] | (b2)->fds_bits[2]); \
Packit b099d7
		(dst)->fds_bits[3] = ((b1)->fds_bits[3] | (b2)->fds_bits[3]); \
Packit b099d7
		(dst)->fds_bits[4] = ((b1)->fds_bits[4] | (b2)->fds_bits[4]); \
Packit b099d7
		(dst)->fds_bits[5] = ((b1)->fds_bits[5] | (b2)->fds_bits[5]); \
Packit b099d7
		(dst)->fds_bits[6] = ((b1)->fds_bits[6] | (b2)->fds_bits[6]); \
Packit b099d7
		(dst)->fds_bits[7] = ((b1)->fds_bits[7] | (b2)->fds_bits[7]);
Packit b099d7
Packit b099d7
#define XFD_UNSET(dst,b1) \
Packit b099d7
		(dst)->fds_bits[0] &= ~((b1)->fds_bits[0]); \
Packit b099d7
		(dst)->fds_bits[1] &= ~((b1)->fds_bits[1]); \
Packit b099d7
		(dst)->fds_bits[2] &= ~((b1)->fds_bits[2]); \
Packit b099d7
		(dst)->fds_bits[3] &= ~((b1)->fds_bits[3]); \
Packit b099d7
		(dst)->fds_bits[4] &= ~((b1)->fds_bits[4]); \
Packit b099d7
		(dst)->fds_bits[5] &= ~((b1)->fds_bits[5]); \
Packit b099d7
		(dst)->fds_bits[6] &= ~((b1)->fds_bits[6]); \
Packit b099d7
		(dst)->fds_bits[7] &= ~((b1)->fds_bits[7]);
Packit b099d7
Packit b099d7
#else /* USE_POLL */
Packit b099d7
#include <sys/poll.h>
Packit b099d7
#endif /* USE_POLL */
Packit b099d7
Packit b099d7
#else /* WIN32 */
Packit b099d7
Packit b099d7
#define XFD_SETSIZE	256
Packit b099d7
#ifndef FD_SETSIZE
Packit b099d7
#define FD_SETSIZE	XFD_SETSIZE
Packit b099d7
#endif
Packit b099d7
#include <X11/Xwinsock.h>
Packit b099d7
Packit b099d7
#define Select(n,r,w,e,t) select(0,(fd_set*)r,(fd_set*)w,(fd_set*)e,(struct timeval*)t)
Packit b099d7
Packit b099d7
#define XFD_SETCOUNT(p)	(((fd_set FAR *)(p))->fd_count)
Packit b099d7
#define XFD_FD(p,i) (((fd_set FAR *)(p))->fd_array[i])
Packit b099d7
#define XFD_ANYSET(p)	XFD_SETCOUNT(p)
Packit b099d7
Packit b099d7
#define XFD_COPYSET(src,dst) { \
Packit b099d7
    u_int __i; \
Packit b099d7
    FD_ZERO(dst); \
Packit b099d7
    for (__i = 0; __i < XFD_SETCOUNT(src) ; __i++) { \
Packit b099d7
        XFD_FD(dst,__i) = XFD_FD(src,__i); \
Packit b099d7
    } \
Packit b099d7
    XFD_SETCOUNT(dst) = XFD_SETCOUNT(src); \
Packit b099d7
}
Packit b099d7
Packit b099d7
#define XFD_ANDSET(dst,b1,b2) { \
Packit b099d7
    u_int __i; \
Packit b099d7
    FD_ZERO(dst); \
Packit b099d7
    for (__i = 0; __i < XFD_SETCOUNT(b1) ; __i++) { \
Packit b099d7
        if (FD_ISSET(XFD_FD(b1,__i), b2)) \
Packit b099d7
	   FD_SET(XFD_FD(b1,__i), dst); \
Packit b099d7
    } \
Packit b099d7
}
Packit b099d7
Packit b099d7
#define XFD_ORSET(dst,b1,b2) { \
Packit b099d7
    u_int __i; \
Packit b099d7
    XFD_COPYSET(b1,dst); \
Packit b099d7
    for (__i = 0; __i < XFD_SETCOUNT(b2) ; __i++) { \
Packit b099d7
        if (!FD_ISSET(XFD_FD(b2,__i), dst)) \
Packit b099d7
	   FD_SET(XFD_FD(b2,__i), dst); \
Packit b099d7
    } \
Packit b099d7
}
Packit b099d7
Packit b099d7
/* this one is really sub-optimal */
Packit b099d7
#define XFD_UNSET(dst,b1) { \
Packit b099d7
    u_int __i; \
Packit b099d7
    for (__i = 0; __i < XFD_SETCOUNT(b1) ; __i++) { \
Packit b099d7
	FD_CLR(XFD_FD(b1,__i), dst); \
Packit b099d7
    } \
Packit b099d7
}
Packit b099d7
Packit b099d7
/* we have to pay the price of having an array here, unlike with bitmasks
Packit b099d7
   calling twice FD_SET with the same fd is not transparent, so be careful */
Packit b099d7
#undef FD_SET
Packit b099d7
#define FD_SET(fd,set) do { \
Packit b099d7
    if (XFD_SETCOUNT(set) < FD_SETSIZE && !FD_ISSET(fd,set)) \
Packit b099d7
        XFD_FD(set,XFD_SETCOUNT(set)++)=(fd); \
Packit b099d7
} while(0)
Packit b099d7
Packit b099d7
#define getdtablesize() FD_SETSIZE 
Packit b099d7
Packit b099d7
#endif /* WIN32 */
Packit b099d7
Packit b099d7
#endif /* _XPOLL_H_ */