1ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes/* $NetBSD: eventlib_p.h,v 1.3 2009/04/12 17:07:17 christos Exp $ */ 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 4ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes * Copyright (c) 2005 by Internet Systems Consortium, Inc. ("ISC") 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1995-1999 by Internet Software Consortium 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this software for any 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * purpose with or without fee is hereby granted, provided that the above 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * copyright notice and this permission notice appear in all copies. 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 20ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes/*! \file 21ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes * \brief private interfaces for eventlib 22ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes * \author vix 09sep95 [initial] 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 24ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes * Id: eventlib_p.h,v 1.9 2006/03/09 23:57:56 marka Exp 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _EVENTLIB_P_H 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _EVENTLIB_P_H 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/param.h> 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/types.h> 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/socket.h> 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <netinet/in.h> 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/un.h> 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define EVENTLIB_DEBUG 1 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <errno.h> 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <fcntl.h> 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stdio.h> 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stdlib.h> 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <string.h> 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <isc/heap.h> 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <isc/list.h> 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <isc/memcluster.h> 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define EV_MASK_ALL (EV_READ | EV_WRITE | EV_EXCEPT) 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define EV_ERR(e) return (errno = (e), -1) 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define OK(x) if ((x) < 0) EV_ERR(errno); else (void)NULL 51ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#define OKFREE(x, y) if ((x) < 0) { FREE((y)); EV_ERR(errno); } \ 52ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes else (void)NULL 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define NEW(p) if (((p) = memget(sizeof *(p))) != NULL) \ 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project FILL(p); \ 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else \ 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (void)NULL; 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define OKNEW(p) if (!((p) = memget(sizeof *(p)))) { \ 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project errno = ENOMEM; \ 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (-1); \ 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else \ 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project FILL(p) 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define FREE(p) memput((p), sizeof *(p)) 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if EVENTLIB_DEBUG 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define FILL(p) memset((p), 0xF5, sizeof *(p)) 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define FILL(p) 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 71ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#ifdef USE_POLL 72ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#ifdef HAVE_STROPTS_H 73ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#include <stropts.h> 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 75ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#include <poll.h> 76ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#endif /* USE_POLL */ 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef struct evConn { 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project evConnFunc func; 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project void * uap; 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int fd; 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int flags; 83ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#define EV_CONN_LISTEN 0x0001 /*%< Connection is a listener. */ 84ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#define EV_CONN_SELECTED 0x0002 /*%< evSelectFD(conn->file). */ 85ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#define EV_CONN_BLOCK 0x0004 /*%< Listener fd was blocking. */ 861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project evFileID file; 871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct evConn * prev; 881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct evConn * next; 891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} evConn; 901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef struct evAccept { 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int fd; 931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project union { 941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct sockaddr sa; 951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct sockaddr_in in; 961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef NO_SOCKADDR_UN 971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct sockaddr_un un; 981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } la; 100ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes ISC_SOCKLEN_T lalen; 1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project union { 1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct sockaddr sa; 1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct sockaddr_in in; 1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef NO_SOCKADDR_UN 1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct sockaddr_un un; 1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } ra; 108ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes ISC_SOCKLEN_T ralen; 1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int ioErrno; 1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project evConn * conn; 1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project LINK(struct evAccept) link; 1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} evAccept; 1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef struct evFile { 1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project evFileFunc func; 1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project void * uap; 1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int fd; 1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int eventmask; 1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int preemptive; 1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct evFile * prev; 1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct evFile * next; 1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct evFile * fdprev; 1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct evFile * fdnext; 1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} evFile; 1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef struct evStream { 1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project evStreamFunc func; 1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project void * uap; 1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project evFileID file; 1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project evTimerID timer; 1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int flags; 132ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#define EV_STR_TIMEROK 0x0001 /*%< IFF timer valid. */ 1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int fd; 1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct iovec * iovOrig; 1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int iovOrigCount; 1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct iovec * iovCur; 1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int iovCurCount; 1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int ioTotal; 1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int ioDone; 1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int ioErrno; 1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct evStream *prevDone, *nextDone; 1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct evStream *prev, *next; 1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} evStream; 1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef struct evTimer { 1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project evTimerFunc func; 1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project void * uap; 1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct timespec due, inter; 1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int index; 1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int mode; 1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define EV_TMR_RATE 1 1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} evTimer; 1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef struct evWait { 1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project evWaitFunc func; 1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project void * uap; 1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const void * tag; 1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct evWait * next; 1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} evWait; 1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef struct evWaitList { 1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project evWait * first; 1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project evWait * last; 1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct evWaitList * prev; 1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct evWaitList * next; 1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} evWaitList; 1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef struct evEvent_p { 1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project enum { Accept, File, Stream, Timer, Wait, Free, Null } type; 1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project union { 1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct { evAccept *this; } accept; 1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct { evFile *this; int eventmask; } file; 1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct { evStream *this; } stream; 1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct { evTimer *this; } timer; 1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct { evWait *this; } wait; 1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct { struct evEvent_p *next; } free; 1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct { const void *placeholder; } null; 1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } u; 1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} evEvent_p; 1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 181ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#ifdef USE_POLL 182ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughestypedef struct { 183ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes void *ctx; /* pointer to the evContext_p */ 184ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes uint32_t type; /* READ, WRITE, EXCEPT, nonblk */ 185ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes uint32_t result; /* 1 => revents, 0 => events */ 186ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes} __evEmulMask; 187ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes 188ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#define emulMaskInit(ctx, field, ev, lastnext) \ 189ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes ctx->field.ctx = ctx; \ 190ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes ctx->field.type = ev; \ 191ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes ctx->field.result = lastnext; 192ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes 193ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughesextern short *__fd_eventfield(int fd, __evEmulMask *maskp); 194ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughesextern short __poll_event(__evEmulMask *maskp); 195ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughesextern void __fd_clr(int fd, __evEmulMask *maskp); 196ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughesextern void __fd_set(int fd, __evEmulMask *maskp); 197ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes 198ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#undef FD_ZERO 199ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#define FD_ZERO(maskp) 200ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes 201ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#undef FD_SET 202ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#define FD_SET(fd, maskp) \ 203ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes __fd_set(fd, maskp) 204ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes 205ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#undef FD_CLR 206ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#define FD_CLR(fd, maskp) \ 207ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes __fd_clr(fd, maskp) 208ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes 209ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#undef FD_ISSET 210ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#define FD_ISSET(fd, maskp) \ 211ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes ((*__fd_eventfield(fd, maskp) & __poll_event(maskp)) != 0) 212ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes 213ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#endif /* USE_POLL */ 214ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes 2151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef struct { 2161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Global. */ 2171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const evEvent_p *cur; 2181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Debugging. */ 2191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int debug; 2201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project FILE *output; 2211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Connections. */ 2221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project evConn *conns; 2231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project LIST(evAccept) accepts; 2241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Files. */ 2251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project evFile *files, *fdNext; 226ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#ifndef USE_POLL 2271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fd_set rdLast, rdNext; 2281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fd_set wrLast, wrNext; 2291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fd_set exLast, exNext; 2301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fd_set nonblockBefore; 2311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int fdMax, fdCount, highestFD; 2321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project evFile *fdTable[FD_SETSIZE]; 233ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#else 234ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes struct pollfd *pollfds; /* Allocated as needed */ 235ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes evFile **fdTable; /* Ditto */ 236ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes int maxnfds; /* # elements in above */ 237ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes int firstfd; /* First active fd */ 238ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes int fdMax; /* Last active fd */ 239ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes int fdCount; /* # fd:s with I/O */ 240ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes int highestFD; /* max fd allowed by OS */ 241ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes __evEmulMask rdLast, rdNext; 242ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes __evEmulMask wrLast, wrNext; 243ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes __evEmulMask exLast, exNext; 244ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes __evEmulMask nonblockBefore; 245ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#endif /* USE_POLL */ 2461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef EVENTLIB_TIME_CHECKS 2471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct timespec lastSelectTime; 2481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int lastFdCount; 2491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Streams. */ 2511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project evStream *streams; 2521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project evStream *strDone, *strLast; 2531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Timers. */ 2541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct timespec lastEventTime; 2551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project heap_context timers; 2561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Waits. */ 2571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project evWaitList *waitLists; 2581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project evWaitList waitDone; 2591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} evContext_p; 2601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* eventlib.c */ 2621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define evPrintf __evPrintf 263ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughesvoid evPrintf(const evContext_p *ctx, int level, const char *fmt, ...) 264ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes ISC_FORMAT_PRINTF(3, 4); 265ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes 266ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#ifdef USE_POLL 267ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughesextern int evPollfdRealloc(evContext_p *ctx, int pollfd_chunk_size, int fd); 268ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughes#endif /* USE_POLL */ 2691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* ev_timers.c */ 2711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define evCreateTimers __evCreateTimers 2721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectheap_context evCreateTimers(const evContext_p *); 2731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define evDestroyTimers __evDestroyTimers 2741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid evDestroyTimers(const evContext_p *); 2751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* ev_waits.c */ 2771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define evFreeWait __evFreeWait 2781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevWait *evFreeWait(evContext_p *ctx, evWait *old); 2791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Global options */ 281ab44f52202878cdf2bf22457aeae33ec24089556Elliott Hughesextern int __evOptMonoTime; 2821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /*_EVENTLIB_P_H*/ 284