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