| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 10 | |
| 11 | |
| 12 | |
| 13 | |
| 14 | |
| 15 | |
| 16 | |
| 17 | |
| 18 | |
| 19 | |
| 20 | |
| 21 | |
| 22 | |
| 23 | |
| 24 | |
| 25 | |
| 26 | |
| 27 | |
| 28 | |
| 29 | |
| 30 | |
| 31 | |
| 32 | |
| 33 | |
| 34 | |
| 35 | |
| 36 | |
| 37 | |
| 38 | |
| 39 | |
| 40 | |
| 41 | |
| 42 | |
| 43 | |
| 44 | |
| 45 | |
| 46 | |
| 47 | |
| 48 | |
| 49 | |
| 50 | #ifndef _XPOLL_H_ |
| 51 | #define _XPOLL_H_ |
| 52 | |
| 53 | #if !defined(WIN32) || defined(__CYGWIN__) |
| 54 | |
| 55 | #ifndef USE_POLL |
| 56 | |
| 57 | #include <X11/Xos.h> |
| 58 | |
| 59 | #include <sys/select.h> |
| 60 | |
| 61 | #include <X11/Xmd.h> |
| 62 | |
| 63 | #ifdef CSRG_BASED |
| 64 | #include <sys/param.h> |
| 65 | # if BSD < 199103 |
| 66 | typedef long fd_mask; |
| 67 | # endif |
| 68 | #endif |
| 69 | |
| 70 | #if defined(FD_SETSIZE) && FD_SETSIZE < 512 |
| 71 | # define XFD_SETSIZE FD_SETSIZE |
| 72 | #else |
| 73 | # define XFD_SETSIZE 512 |
| 74 | # ifndef FD_SETSIZE |
| 75 | # define FD_SETSIZE XFD_SETSIZE |
| 76 | # endif |
| 77 | #endif |
| 78 | |
| 79 | #ifndef NBBY |
| 80 | #define NBBY 8 |
| 81 | #endif |
| 82 | |
| 83 | #ifndef NFDBITS |
| 84 | #define NFDBITS (sizeof(fd_mask) * NBBY) |
| 85 | #endif |
| 86 | |
| 87 | #ifndef howmany |
| 88 | #define howmany(x,y) (((x)+((y)-1))/(y)) |
| 89 | #endif |
| 90 | |
| 91 | #if defined(BSD) && BSD < 198911 |
| 92 | typedef struct fd_set { |
| 93 | fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)]; |
| 94 | } fd_set; |
| 95 | #endif |
| 96 | |
| 97 | # define Select(n,r,w,e,t) select(n,(fd_set*)r,(fd_set*)w,(fd_set*)e,(struct timeval*)t) |
| 98 | |
| 99 | #define __X_FDS_BITS fds_bits |
| 100 | |
| 101 | #ifndef __FDS_BITS |
| 102 | # define __FDS_BITS(p) ((p)->__X_FDS_BITS) |
| 103 | #endif |
| 104 | |
| 105 | #define __XFDS_BITS(p, n) (__FDS_BITS(p))[n] |
| 106 | |
| 107 | #ifndef FD_SET |
| 108 | #define FD_SET(n, p) (__XFDS_BITS(p, ((n)/NFDBITS)) |= ((fd_mask)1 << ((n) % NFDBITS))) |
| 109 | #endif |
| 110 | #ifndef FD_CLR |
| 111 | #define FD_CLR(n, p) (__XFDS_BITS((p), ((n)/NFDBITS)) &= ~((fd_mask)1 << ((n) % NFDBITS))) |
| 112 | #endif |
| 113 | #ifndef FD_ISSET |
| 114 | #define FD_ISSET(n, p) ((__XFDS_BITS((p), ((n)/NFDBITS))) & ((fd_mask)1 << ((n) % NFDBITS))) |
| 115 | #endif |
| 116 | #ifndef FD_ZERO |
| 117 | #define FD_ZERO(p) bzero((char *)(p), sizeof(*(p))) |
| 118 | #endif |
| 119 | |
| 120 | |
| 121 | |
| 122 | |
| 123 | |
| 124 | |
| 125 | #define XFD_ANYSET(p) \ |
| 126 | ((howmany(FD_SETSIZE, NFDBITS) > 0 && (__XFDS_BITS(p, 0))) || \ |
| 127 | (howmany(FD_SETSIZE, NFDBITS) > 1 && (__XFDS_BITS(p, 1))) || \ |
| 128 | (howmany(FD_SETSIZE, NFDBITS) > 2 && (__XFDS_BITS(p, 2))) || \ |
| 129 | (howmany(FD_SETSIZE, NFDBITS) > 3 && (__XFDS_BITS(p, 3))) || \ |
| 130 | (howmany(FD_SETSIZE, NFDBITS) > 4 && (__XFDS_BITS(p, 4))) || \ |
| 131 | (howmany(FD_SETSIZE, NFDBITS) > 5 && (__XFDS_BITS(p, 5))) || \ |
| 132 | (howmany(FD_SETSIZE, NFDBITS) > 6 && (__XFDS_BITS(p, 6))) || \ |
| 133 | (howmany(FD_SETSIZE, NFDBITS) > 7 && (__XFDS_BITS(p, 7))) || \ |
| 134 | (howmany(FD_SETSIZE, NFDBITS) > 8 && (__XFDS_BITS(p, 8))) || \ |
| 135 | (howmany(FD_SETSIZE, NFDBITS) > 9 && (__XFDS_BITS(p, 9))) || \ |
| 136 | (howmany(FD_SETSIZE, NFDBITS) > 10 && (__XFDS_BITS(p, 10))) || \ |
| 137 | (howmany(FD_SETSIZE, NFDBITS) > 11 && (__XFDS_BITS(p, 11))) || \ |
| 138 | (howmany(FD_SETSIZE, NFDBITS) > 12 && (__XFDS_BITS(p, 12))) || \ |
| 139 | (howmany(FD_SETSIZE, NFDBITS) > 13 && (__XFDS_BITS(p, 13))) || \ |
| 140 | (howmany(FD_SETSIZE, NFDBITS) > 14 && (__XFDS_BITS(p, 14))) || \ |
| 141 | (howmany(FD_SETSIZE, NFDBITS) > 15 && (__XFDS_BITS(p, 15)))) |
| 142 | |
| 143 | |
| 144 | #define XFD_COPYSET(src,dst) { \ |
| 145 | int __i__; \ |
| 146 | for (__i__ = 0; __i__ < howmany(FD_SETSIZE, NFDBITS); __i__++) \ |
| 147 | __XFDS_BITS((dst), __i__) = __XFDS_BITS((src), __i__); \ |
| 148 | } |
| 149 | #define XFD_ANDSET(dst,b1,b2) { \ |
| 150 | int __i__; \ |
| 151 | for (__i__ = 0; __i__ < howmany(FD_SETSIZE, NFDBITS); __i__++) \ |
| 152 | __XFDS_BITS((dst), __i__) = ((__XFDS_BITS((b1), __i__)) & (__XFDS_BITS((b2), __i__))); \ |
| 153 | } |
| 154 | #define XFD_ORSET(dst,b1,b2) { \ |
| 155 | int __i__; \ |
| 156 | for (__i__ = 0; __i__ < howmany(FD_SETSIZE, NFDBITS); __i__++) \ |
| 157 | __XFDS_BITS((dst), __i__) = ((__XFDS_BITS((b1), __i__)) | (__XFDS_BITS((b2), __i__))); \ |
| 158 | } |
| 159 | #define XFD_UNSET(dst,b1) { \ |
| 160 | int __i__; \ |
| 161 | for (__i__ = 0; __i__ < howmany(FD_SETSIZE, NFDBITS); __i__++) \ |
| 162 | __XFDS_BITS((dst), __i__) &= ~(__XFDS_BITS((b1), __i__)); \ |
| 163 | } |
| 164 | |
| 165 | #else |
| 166 | #include <poll.h> |
| 167 | #endif |
| 168 | |
| 169 | #else |
| 170 | |
| 171 | #define XFD_SETSIZE 512 |
| 172 | #ifndef FD_SETSIZE |
| 173 | #define FD_SETSIZE XFD_SETSIZE |
| 174 | #endif |
| 175 | #include <X11/Xwinsock.h> |
| 176 | |
| 177 | #define Select(n,r,w,e,t) select(0,(fd_set*)r,(fd_set*)w,(fd_set*)e,(struct timeval*)t) |
| 178 | |
| 179 | #define XFD_SETCOUNT(p) (((fd_set FAR *)(p))->fd_count) |
| 180 | #define XFD_FD(p,i) (((fd_set FAR *)(p))->fd_array[i]) |
| 181 | #define XFD_ANYSET(p) XFD_SETCOUNT(p) |
| 182 | |
| 183 | #define XFD_COPYSET(src,dst) { \ |
| 184 | u_int __i; \ |
| 185 | FD_ZERO(dst); \ |
| 186 | for (__i = 0; __i < XFD_SETCOUNT(src) ; __i++) { \ |
| 187 | XFD_FD(dst,__i) = XFD_FD(src,__i); \ |
| 188 | } \ |
| 189 | XFD_SETCOUNT(dst) = XFD_SETCOUNT(src); \ |
| 190 | } |
| 191 | |
| 192 | #define XFD_ANDSET(dst,b1,b2) { \ |
| 193 | u_int __i; \ |
| 194 | FD_ZERO(dst); \ |
| 195 | for (__i = 0; __i < XFD_SETCOUNT(b1) ; __i++) { \ |
| 196 | if (FD_ISSET(XFD_FD(b1,__i), b2)) \ |
| 197 | FD_SET(XFD_FD(b1,__i), dst); \ |
| 198 | } \ |
| 199 | } |
| 200 | |
| 201 | #define XFD_ORSET(dst,b1,b2) { \ |
| 202 | u_int __i; \ |
| 203 | if (dst != b1) XFD_COPYSET(b1,dst); \ |
| 204 | for (__i = 0; __i < XFD_SETCOUNT(b2) ; __i++) { \ |
| 205 | if (!FD_ISSET(XFD_FD(b2,__i), dst)) \ |
| 206 | FD_SET(XFD_FD(b2,__i), dst); \ |
| 207 | } \ |
| 208 | } |
| 209 | |
| 210 | |
| 211 | #define XFD_UNSET(dst,b1) { \ |
| 212 | u_int __i; \ |
| 213 | for (__i = 0; __i < XFD_SETCOUNT(b1) ; __i++) { \ |
| 214 | FD_CLR(XFD_FD(b1,__i), dst); \ |
| 215 | } \ |
| 216 | } |
| 217 | |
| 218 | |
| 219 | |
| 220 | #undef FD_SET |
| 221 | #define FD_SET(fd,set) do { \ |
| 222 | if (XFD_SETCOUNT(set) < FD_SETSIZE && !FD_ISSET(fd,set)) \ |
| 223 | XFD_FD(set,XFD_SETCOUNT(set)++)=(fd); \ |
| 224 | } while(0) |
| 225 | |
| 226 | #define getdtablesize() FD_SETSIZE |
| 227 | |
| 228 | #endif |
| 229 | |
| 230 | #endif |