1/* 2 * Copyright (c) 2005 by Internet Systems Consortium, Inc. ("ISC") 3 * Copyright (c) 1995-1999 by Internet Software Consortium 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 15 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18/* eventlib_p.h - private interfaces for eventlib 19 * vix 09sep95 [initial] 20 *
| 1/* 2 * Copyright (c) 2005 by Internet Systems Consortium, Inc. ("ISC") 3 * Copyright (c) 1995-1999 by Internet Software Consortium 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 15 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18/* eventlib_p.h - private interfaces for eventlib 19 * vix 09sep95 [initial] 20 *
|
51 52#define NEW(p) if (((p) = memget(sizeof *(p))) != NULL) \ 53 FILL(p); \ 54 else \ 55 (void)NULL; 56#define OKNEW(p) if (!((p) = memget(sizeof *(p)))) { \ 57 errno = ENOMEM; \ 58 return (-1); \ 59 } else \ 60 FILL(p) 61#define FREE(p) memput((p), sizeof *(p)) 62 63#if EVENTLIB_DEBUG 64#define FILL(p) memset((p), 0xF5, sizeof *(p)) 65#else 66#define FILL(p) 67#endif 68 69#ifdef USE_POLL 70#ifdef HAVE_STROPTS_H 71#include <stropts.h> 72#endif 73#include <poll.h> 74#endif /* USE_POLL */ 75 76typedef struct evConn { 77 evConnFunc func; 78 void * uap; 79 int fd; 80 int flags; 81#define EV_CONN_LISTEN 0x0001 /* Connection is a listener. */ 82#define EV_CONN_SELECTED 0x0002 /* evSelectFD(conn->file). */ 83#define EV_CONN_BLOCK 0x0004 /* Listener fd was blocking. */ 84 evFileID file; 85 struct evConn * prev; 86 struct evConn * next; 87} evConn; 88 89#ifndef _LIBC 90typedef struct evAccept { 91 int fd; 92 union { 93 struct sockaddr sa; 94 struct sockaddr_in in; 95#ifndef NO_SOCKADDR_UN 96 struct sockaddr_un un; 97#endif 98 } la; 99 ISC_SOCKLEN_T lalen; 100 union { 101 struct sockaddr sa; 102 struct sockaddr_in in; 103#ifndef NO_SOCKADDR_UN 104 struct sockaddr_un un; 105#endif 106 } ra; 107 ISC_SOCKLEN_T ralen; 108 int ioErrno; 109 evConn * conn; 110 LINK(struct evAccept) link; 111} evAccept; 112 113typedef struct evFile { 114 evFileFunc func; 115 void * uap; 116 int fd; 117 int eventmask; 118 int preemptive; 119 struct evFile * prev; 120 struct evFile * next; 121 struct evFile * fdprev; 122 struct evFile * fdnext; 123} evFile; 124 125typedef struct evStream { 126 evStreamFunc func; 127 void * uap; 128 evFileID file; 129 evTimerID timer; 130 int flags; 131#define EV_STR_TIMEROK 0x0001 /* IFF timer valid. */ 132 int fd; 133 struct iovec * iovOrig; 134 int iovOrigCount; 135 struct iovec * iovCur; 136 int iovCurCount; 137 int ioTotal; 138 int ioDone; 139 int ioErrno; 140 struct evStream *prevDone, *nextDone; 141 struct evStream *prev, *next; 142} evStream; 143 144typedef struct evTimer { 145 evTimerFunc func; 146 void * uap; 147 struct timespec due, inter; 148 int index; 149 int mode; 150#define EV_TMR_RATE 1 151} evTimer; 152 153typedef struct evWait { 154 evWaitFunc func; 155 void * uap; 156 const void * tag; 157 struct evWait * next; 158} evWait; 159 160typedef struct evWaitList { 161 evWait * first; 162 evWait * last; 163 struct evWaitList * prev; 164 struct evWaitList * next; 165} evWaitList; 166 167typedef struct evEvent_p { 168 enum { Accept, File, Stream, Timer, Wait, Free, Null } type; 169 union { 170 struct { evAccept *this; } accept; 171 struct { evFile *this; int eventmask; } file; 172 struct { evStream *this; } stream; 173 struct { evTimer *this; } timer; 174 struct { evWait *this; } wait; 175 struct { struct evEvent_p *next; } free; 176 struct { const void *placeholder; } null; 177 } u; 178} evEvent_p; 179#endif 180 181#ifdef USE_POLL 182typedef struct { 183 void *ctx; /* pointer to the evContext_p */ 184 uint32_t type; /* READ, WRITE, EXCEPT, nonblk */ 185 uint32_t result; /* 1 => revents, 0 => events */ 186} __evEmulMask; 187 188#define emulMaskInit(ctx, field, ev, lastnext) \ 189 ctx->field.ctx = ctx; \ 190 ctx->field.type = ev; \ 191 ctx->field.result = lastnext; 192 193extern short *__fd_eventfield(int fd, __evEmulMask *maskp); 194extern short __poll_event(__evEmulMask *maskp); 195extern void __fd_clr(int fd, __evEmulMask *maskp); 196extern void __fd_set(int fd, __evEmulMask *maskp); 197 198#undef FD_ZERO 199#define FD_ZERO(maskp) 200 201#undef FD_SET 202#define FD_SET(fd, maskp) \ 203 __fd_set(fd, maskp) 204 205#undef FD_CLR 206#define FD_CLR(fd, maskp) \ 207 __fd_clr(fd, maskp) 208 209#undef FD_ISSET 210#define FD_ISSET(fd, maskp) \ 211 ((*__fd_eventfield(fd, maskp) & __poll_event(maskp)) != 0) 212 213#endif /* USE_POLL */ 214 215#ifndef _LIBC 216typedef struct { 217 /* Global. */ 218 const evEvent_p *cur; 219 /* Debugging. */ 220 int debug; 221 FILE *output; 222 /* Connections. */ 223 evConn *conns; 224 LIST(evAccept) accepts; 225 /* Files. */ 226 evFile *files, *fdNext; 227#ifndef USE_POLL 228 fd_set rdLast, rdNext; 229 fd_set wrLast, wrNext; 230 fd_set exLast, exNext; 231 fd_set nonblockBefore; 232 int fdMax, fdCount, highestFD; 233 evFile *fdTable[FD_SETSIZE]; 234#else 235 struct pollfd *pollfds; /* Allocated as needed */ 236 evFile **fdTable; /* Ditto */ 237 int maxnfds; /* # elements in above */ 238 int firstfd; /* First active fd */ 239 int fdMax; /* Last active fd */ 240 int fdCount; /* # fd:s with I/O */ 241 int highestFD; /* max fd allowed by OS */ 242 __evEmulMask rdLast, rdNext; 243 __evEmulMask wrLast, wrNext; 244 __evEmulMask exLast, exNext; 245 __evEmulMask nonblockBefore; 246#endif /* USE_POLL */ 247#ifdef EVENTLIB_TIME_CHECKS 248 struct timespec lastSelectTime; 249 int lastFdCount; 250#endif 251 /* Streams. */ 252 evStream *streams; 253 evStream *strDone, *strLast; 254 /* Timers. */ 255 struct timespec lastEventTime; 256 heap_context timers; 257 /* Waits. */ 258 evWaitList *waitLists; 259 evWaitList waitDone; 260} evContext_p; 261 262/* eventlib.c */ 263#define evPrintf __evPrintf 264void evPrintf(const evContext_p *ctx, int level, const char *fmt, ...) 265 ISC_FORMAT_PRINTF(3, 4); 266 267#ifdef USE_POLL 268extern int evPollfdRealloc(evContext_p *ctx, int pollfd_chunk_size, int fd); 269#endif /* USE_POLL */ 270 271/* ev_timers.c */ 272#define evCreateTimers __evCreateTimers 273heap_context evCreateTimers(const evContext_p *); 274#define evDestroyTimers __evDestroyTimers 275void evDestroyTimers(const evContext_p *); 276 277/* ev_waits.c */ 278#define evFreeWait __evFreeWait 279evWait *evFreeWait(evContext_p *ctx, evWait *old); 280#endif 281 282/* Global options */ 283#ifndef _LIBC 284extern int __evOptMonoTime; 285#endif 286 287#endif /*_EVENTLIB_P_H*/
| 53 54#define NEW(p) if (((p) = memget(sizeof *(p))) != NULL) \ 55 FILL(p); \ 56 else \ 57 (void)NULL; 58#define OKNEW(p) if (!((p) = memget(sizeof *(p)))) { \ 59 errno = ENOMEM; \ 60 return (-1); \ 61 } else \ 62 FILL(p) 63#define FREE(p) memput((p), sizeof *(p)) 64 65#if EVENTLIB_DEBUG 66#define FILL(p) memset((p), 0xF5, sizeof *(p)) 67#else 68#define FILL(p) 69#endif 70 71#ifdef USE_POLL 72#ifdef HAVE_STROPTS_H 73#include <stropts.h> 74#endif 75#include <poll.h> 76#endif /* USE_POLL */ 77 78typedef struct evConn { 79 evConnFunc func; 80 void * uap; 81 int fd; 82 int flags; 83#define EV_CONN_LISTEN 0x0001 /* Connection is a listener. */ 84#define EV_CONN_SELECTED 0x0002 /* evSelectFD(conn->file). */ 85#define EV_CONN_BLOCK 0x0004 /* Listener fd was blocking. */ 86 evFileID file; 87 struct evConn * prev; 88 struct evConn * next; 89} evConn; 90 91#ifndef _LIBC 92typedef struct evAccept { 93 int fd; 94 union { 95 struct sockaddr sa; 96 struct sockaddr_in in; 97#ifndef NO_SOCKADDR_UN 98 struct sockaddr_un un; 99#endif 100 } la; 101 ISC_SOCKLEN_T lalen; 102 union { 103 struct sockaddr sa; 104 struct sockaddr_in in; 105#ifndef NO_SOCKADDR_UN 106 struct sockaddr_un un; 107#endif 108 } ra; 109 ISC_SOCKLEN_T ralen; 110 int ioErrno; 111 evConn * conn; 112 LINK(struct evAccept) link; 113} evAccept; 114 115typedef struct evFile { 116 evFileFunc func; 117 void * uap; 118 int fd; 119 int eventmask; 120 int preemptive; 121 struct evFile * prev; 122 struct evFile * next; 123 struct evFile * fdprev; 124 struct evFile * fdnext; 125} evFile; 126 127typedef struct evStream { 128 evStreamFunc func; 129 void * uap; 130 evFileID file; 131 evTimerID timer; 132 int flags; 133#define EV_STR_TIMEROK 0x0001 /* IFF timer valid. */ 134 int fd; 135 struct iovec * iovOrig; 136 int iovOrigCount; 137 struct iovec * iovCur; 138 int iovCurCount; 139 int ioTotal; 140 int ioDone; 141 int ioErrno; 142 struct evStream *prevDone, *nextDone; 143 struct evStream *prev, *next; 144} evStream; 145 146typedef struct evTimer { 147 evTimerFunc func; 148 void * uap; 149 struct timespec due, inter; 150 int index; 151 int mode; 152#define EV_TMR_RATE 1 153} evTimer; 154 155typedef struct evWait { 156 evWaitFunc func; 157 void * uap; 158 const void * tag; 159 struct evWait * next; 160} evWait; 161 162typedef struct evWaitList { 163 evWait * first; 164 evWait * last; 165 struct evWaitList * prev; 166 struct evWaitList * next; 167} evWaitList; 168 169typedef struct evEvent_p { 170 enum { Accept, File, Stream, Timer, Wait, Free, Null } type; 171 union { 172 struct { evAccept *this; } accept; 173 struct { evFile *this; int eventmask; } file; 174 struct { evStream *this; } stream; 175 struct { evTimer *this; } timer; 176 struct { evWait *this; } wait; 177 struct { struct evEvent_p *next; } free; 178 struct { const void *placeholder; } null; 179 } u; 180} evEvent_p; 181#endif 182 183#ifdef USE_POLL 184typedef struct { 185 void *ctx; /* pointer to the evContext_p */ 186 uint32_t type; /* READ, WRITE, EXCEPT, nonblk */ 187 uint32_t result; /* 1 => revents, 0 => events */ 188} __evEmulMask; 189 190#define emulMaskInit(ctx, field, ev, lastnext) \ 191 ctx->field.ctx = ctx; \ 192 ctx->field.type = ev; \ 193 ctx->field.result = lastnext; 194 195extern short *__fd_eventfield(int fd, __evEmulMask *maskp); 196extern short __poll_event(__evEmulMask *maskp); 197extern void __fd_clr(int fd, __evEmulMask *maskp); 198extern void __fd_set(int fd, __evEmulMask *maskp); 199 200#undef FD_ZERO 201#define FD_ZERO(maskp) 202 203#undef FD_SET 204#define FD_SET(fd, maskp) \ 205 __fd_set(fd, maskp) 206 207#undef FD_CLR 208#define FD_CLR(fd, maskp) \ 209 __fd_clr(fd, maskp) 210 211#undef FD_ISSET 212#define FD_ISSET(fd, maskp) \ 213 ((*__fd_eventfield(fd, maskp) & __poll_event(maskp)) != 0) 214 215#endif /* USE_POLL */ 216 217#ifndef _LIBC 218typedef struct { 219 /* Global. */ 220 const evEvent_p *cur; 221 /* Debugging. */ 222 int debug; 223 FILE *output; 224 /* Connections. */ 225 evConn *conns; 226 LIST(evAccept) accepts; 227 /* Files. */ 228 evFile *files, *fdNext; 229#ifndef USE_POLL 230 fd_set rdLast, rdNext; 231 fd_set wrLast, wrNext; 232 fd_set exLast, exNext; 233 fd_set nonblockBefore; 234 int fdMax, fdCount, highestFD; 235 evFile *fdTable[FD_SETSIZE]; 236#else 237 struct pollfd *pollfds; /* Allocated as needed */ 238 evFile **fdTable; /* Ditto */ 239 int maxnfds; /* # elements in above */ 240 int firstfd; /* First active fd */ 241 int fdMax; /* Last active fd */ 242 int fdCount; /* # fd:s with I/O */ 243 int highestFD; /* max fd allowed by OS */ 244 __evEmulMask rdLast, rdNext; 245 __evEmulMask wrLast, wrNext; 246 __evEmulMask exLast, exNext; 247 __evEmulMask nonblockBefore; 248#endif /* USE_POLL */ 249#ifdef EVENTLIB_TIME_CHECKS 250 struct timespec lastSelectTime; 251 int lastFdCount; 252#endif 253 /* Streams. */ 254 evStream *streams; 255 evStream *strDone, *strLast; 256 /* Timers. */ 257 struct timespec lastEventTime; 258 heap_context timers; 259 /* Waits. */ 260 evWaitList *waitLists; 261 evWaitList waitDone; 262} evContext_p; 263 264/* eventlib.c */ 265#define evPrintf __evPrintf 266void evPrintf(const evContext_p *ctx, int level, const char *fmt, ...) 267 ISC_FORMAT_PRINTF(3, 4); 268 269#ifdef USE_POLL 270extern int evPollfdRealloc(evContext_p *ctx, int pollfd_chunk_size, int fd); 271#endif /* USE_POLL */ 272 273/* ev_timers.c */ 274#define evCreateTimers __evCreateTimers 275heap_context evCreateTimers(const evContext_p *); 276#define evDestroyTimers __evDestroyTimers 277void evDestroyTimers(const evContext_p *); 278 279/* ev_waits.c */ 280#define evFreeWait __evFreeWait 281evWait *evFreeWait(evContext_p *ctx, evWait *old); 282#endif 283 284/* Global options */ 285#ifndef _LIBC 286extern int __evOptMonoTime; 287#endif 288 289#endif /*_EVENTLIB_P_H*/
|