xref: /aosp_15_r20/external/cronet/third_party/libevent/event.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker /*
2*6777b538SAndroid Build Coastguard Worker  * Copyright (c) 2000-2007 Niels Provos <[email protected]>
3*6777b538SAndroid Build Coastguard Worker  * All rights reserved.
4*6777b538SAndroid Build Coastguard Worker  *
5*6777b538SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
6*6777b538SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
7*6777b538SAndroid Build Coastguard Worker  * are met:
8*6777b538SAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
9*6777b538SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
10*6777b538SAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
11*6777b538SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
12*6777b538SAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
13*6777b538SAndroid Build Coastguard Worker  * 3. The name of the author may not be used to endorse or promote products
14*6777b538SAndroid Build Coastguard Worker  *    derived from this software without specific prior written permission.
15*6777b538SAndroid Build Coastguard Worker  *
16*6777b538SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17*6777b538SAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18*6777b538SAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19*6777b538SAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20*6777b538SAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21*6777b538SAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22*6777b538SAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23*6777b538SAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24*6777b538SAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25*6777b538SAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*6777b538SAndroid Build Coastguard Worker  */
27*6777b538SAndroid Build Coastguard Worker #ifndef _EVENT_H_
28*6777b538SAndroid Build Coastguard Worker #define _EVENT_H_
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker /** @mainpage
31*6777b538SAndroid Build Coastguard Worker 
32*6777b538SAndroid Build Coastguard Worker   @section intro Introduction
33*6777b538SAndroid Build Coastguard Worker 
34*6777b538SAndroid Build Coastguard Worker   libevent is an event notification library for developing scalable network
35*6777b538SAndroid Build Coastguard Worker   servers.  The libevent API provides a mechanism to execute a callback
36*6777b538SAndroid Build Coastguard Worker   function when a specific event occurs on a file descriptor or after a
37*6777b538SAndroid Build Coastguard Worker   timeout has been reached. Furthermore, libevent also support callbacks due
38*6777b538SAndroid Build Coastguard Worker   to signals or regular timeouts.
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker   libevent is meant to replace the event loop found in event driven network
41*6777b538SAndroid Build Coastguard Worker   servers. An application just needs to call event_dispatch() and then add or
42*6777b538SAndroid Build Coastguard Worker   remove events dynamically without having to change the event loop.
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker   Currently, libevent supports /dev/poll, kqueue(2), select(2), poll(2) and
45*6777b538SAndroid Build Coastguard Worker   epoll(4). It also has experimental support for real-time signals. The
46*6777b538SAndroid Build Coastguard Worker   internal event mechanism is completely independent of the exposed event API,
47*6777b538SAndroid Build Coastguard Worker   and a simple update of libevent can provide new functionality without having
48*6777b538SAndroid Build Coastguard Worker   to redesign the applications. As a result, Libevent allows for portable
49*6777b538SAndroid Build Coastguard Worker   application development and provides the most scalable event notification
50*6777b538SAndroid Build Coastguard Worker   mechanism available on an operating system. Libevent can also be used for
51*6777b538SAndroid Build Coastguard Worker   multi-threaded aplications; see Steven Grimm's explanation. Libevent should
52*6777b538SAndroid Build Coastguard Worker   compile on Linux, *BSD, Mac OS X, Solaris and Windows.
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker   @section usage Standard usage
55*6777b538SAndroid Build Coastguard Worker 
56*6777b538SAndroid Build Coastguard Worker   Every program that uses libevent must include the <event.h> header, and pass
57*6777b538SAndroid Build Coastguard Worker   the -levent flag to the linker.  Before using any of the functions in the
58*6777b538SAndroid Build Coastguard Worker   library, you must call event_init() or event_base_new() to perform one-time
59*6777b538SAndroid Build Coastguard Worker   initialization of the libevent library.
60*6777b538SAndroid Build Coastguard Worker 
61*6777b538SAndroid Build Coastguard Worker   @section event Event notification
62*6777b538SAndroid Build Coastguard Worker 
63*6777b538SAndroid Build Coastguard Worker   For each file descriptor that you wish to monitor, you must declare an event
64*6777b538SAndroid Build Coastguard Worker   structure and call event_set() to initialize the members of the structure.
65*6777b538SAndroid Build Coastguard Worker   To enable notification, you add the structure to the list of monitored
66*6777b538SAndroid Build Coastguard Worker   events by calling event_add().  The event structure must remain allocated as
67*6777b538SAndroid Build Coastguard Worker   long as it is active, so it should be allocated on the heap. Finally, you
68*6777b538SAndroid Build Coastguard Worker   call event_dispatch() to loop and dispatch events.
69*6777b538SAndroid Build Coastguard Worker 
70*6777b538SAndroid Build Coastguard Worker   @section bufferevent I/O Buffers
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker   libevent provides an abstraction on top of the regular event callbacks. This
73*6777b538SAndroid Build Coastguard Worker   abstraction is called a buffered event. A buffered event provides input and
74*6777b538SAndroid Build Coastguard Worker   output buffers that get filled and drained automatically. The user of a
75*6777b538SAndroid Build Coastguard Worker   buffered event no longer deals directly with the I/O, but instead is reading
76*6777b538SAndroid Build Coastguard Worker   from input and writing to output buffers.
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker   Once initialized via bufferevent_new(), the bufferevent structure can be
79*6777b538SAndroid Build Coastguard Worker   used repeatedly with bufferevent_enable() and bufferevent_disable().
80*6777b538SAndroid Build Coastguard Worker   Instead of reading and writing directly to a socket, you would call
81*6777b538SAndroid Build Coastguard Worker   bufferevent_read() and bufferevent_write().
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker   When read enabled the bufferevent will try to read from the file descriptor
84*6777b538SAndroid Build Coastguard Worker   and call the read callback. The write callback is executed whenever the
85*6777b538SAndroid Build Coastguard Worker   output buffer is drained below the write low watermark, which is 0 by
86*6777b538SAndroid Build Coastguard Worker   default.
87*6777b538SAndroid Build Coastguard Worker 
88*6777b538SAndroid Build Coastguard Worker   @section timers Timers
89*6777b538SAndroid Build Coastguard Worker 
90*6777b538SAndroid Build Coastguard Worker   libevent can also be used to create timers that invoke a callback after a
91*6777b538SAndroid Build Coastguard Worker   certain amount of time has expired. The evtimer_set() function prepares an
92*6777b538SAndroid Build Coastguard Worker   event struct to be used as a timer. To activate the timer, call
93*6777b538SAndroid Build Coastguard Worker   evtimer_add(). Timers can be deactivated by calling evtimer_del().
94*6777b538SAndroid Build Coastguard Worker 
95*6777b538SAndroid Build Coastguard Worker   @section timeouts Timeouts
96*6777b538SAndroid Build Coastguard Worker 
97*6777b538SAndroid Build Coastguard Worker   In addition to simple timers, libevent can assign timeout events to file
98*6777b538SAndroid Build Coastguard Worker   descriptors that are triggered whenever a certain amount of time has passed
99*6777b538SAndroid Build Coastguard Worker   with no activity on a file descriptor.  The timeout_set() function
100*6777b538SAndroid Build Coastguard Worker   initializes an event struct for use as a timeout. Once initialized, the
101*6777b538SAndroid Build Coastguard Worker   event must be activated by using timeout_add().  To cancel the timeout, call
102*6777b538SAndroid Build Coastguard Worker   timeout_del().
103*6777b538SAndroid Build Coastguard Worker 
104*6777b538SAndroid Build Coastguard Worker   @section evdns Asynchronous DNS resolution
105*6777b538SAndroid Build Coastguard Worker 
106*6777b538SAndroid Build Coastguard Worker   libevent provides an asynchronous DNS resolver that should be used instead
107*6777b538SAndroid Build Coastguard Worker   of the standard DNS resolver functions.  These functions can be imported by
108*6777b538SAndroid Build Coastguard Worker   including the <evdns.h> header in your program. Before using any of the
109*6777b538SAndroid Build Coastguard Worker   resolver functions, you must call evdns_init() to initialize the library. To
110*6777b538SAndroid Build Coastguard Worker   convert a hostname to an IP address, you call the evdns_resolve_ipv4()
111*6777b538SAndroid Build Coastguard Worker   function.  To perform a reverse lookup, you would call the
112*6777b538SAndroid Build Coastguard Worker   evdns_resolve_reverse() function.  All of these functions use callbacks to
113*6777b538SAndroid Build Coastguard Worker   avoid blocking while the lookup is performed.
114*6777b538SAndroid Build Coastguard Worker 
115*6777b538SAndroid Build Coastguard Worker   @section evhttp Event-driven HTTP servers
116*6777b538SAndroid Build Coastguard Worker 
117*6777b538SAndroid Build Coastguard Worker   libevent provides a very simple event-driven HTTP server that can be
118*6777b538SAndroid Build Coastguard Worker   embedded in your program and used to service HTTP requests.
119*6777b538SAndroid Build Coastguard Worker 
120*6777b538SAndroid Build Coastguard Worker   To use this capability, you need to include the <evhttp.h> header in your
121*6777b538SAndroid Build Coastguard Worker   program.  You create the server by calling evhttp_new(). Add addresses and
122*6777b538SAndroid Build Coastguard Worker   ports to listen on with evhttp_bind_socket(). You then register one or more
123*6777b538SAndroid Build Coastguard Worker   callbacks to handle incoming requests.  Each URI can be assigned a callback
124*6777b538SAndroid Build Coastguard Worker   via the evhttp_set_cb() function.  A generic callback function can also be
125*6777b538SAndroid Build Coastguard Worker   registered via evhttp_set_gencb(); this callback will be invoked if no other
126*6777b538SAndroid Build Coastguard Worker   callbacks have been registered for a given URI.
127*6777b538SAndroid Build Coastguard Worker 
128*6777b538SAndroid Build Coastguard Worker   @section evrpc A framework for RPC servers and clients
129*6777b538SAndroid Build Coastguard Worker 
130*6777b538SAndroid Build Coastguard Worker   libevents provides a framework for creating RPC servers and clients.  It
131*6777b538SAndroid Build Coastguard Worker   takes care of marshaling and unmarshaling all data structures.
132*6777b538SAndroid Build Coastguard Worker 
133*6777b538SAndroid Build Coastguard Worker   @section api API Reference
134*6777b538SAndroid Build Coastguard Worker 
135*6777b538SAndroid Build Coastguard Worker   To browse the complete documentation of the libevent API, click on any of
136*6777b538SAndroid Build Coastguard Worker   the following links.
137*6777b538SAndroid Build Coastguard Worker 
138*6777b538SAndroid Build Coastguard Worker   event.h
139*6777b538SAndroid Build Coastguard Worker   The primary libevent header
140*6777b538SAndroid Build Coastguard Worker 
141*6777b538SAndroid Build Coastguard Worker   evdns.h
142*6777b538SAndroid Build Coastguard Worker   Asynchronous DNS resolution
143*6777b538SAndroid Build Coastguard Worker 
144*6777b538SAndroid Build Coastguard Worker   evhttp.h
145*6777b538SAndroid Build Coastguard Worker   An embedded libevent-based HTTP server
146*6777b538SAndroid Build Coastguard Worker 
147*6777b538SAndroid Build Coastguard Worker   evrpc.h
148*6777b538SAndroid Build Coastguard Worker   A framework for creating RPC servers and clients
149*6777b538SAndroid Build Coastguard Worker 
150*6777b538SAndroid Build Coastguard Worker  */
151*6777b538SAndroid Build Coastguard Worker 
152*6777b538SAndroid Build Coastguard Worker /** @file event.h
153*6777b538SAndroid Build Coastguard Worker 
154*6777b538SAndroid Build Coastguard Worker   A library for writing event-driven network servers
155*6777b538SAndroid Build Coastguard Worker 
156*6777b538SAndroid Build Coastguard Worker  */
157*6777b538SAndroid Build Coastguard Worker 
158*6777b538SAndroid Build Coastguard Worker #ifdef __cplusplus
159*6777b538SAndroid Build Coastguard Worker extern "C" {
160*6777b538SAndroid Build Coastguard Worker #endif
161*6777b538SAndroid Build Coastguard Worker 
162*6777b538SAndroid Build Coastguard Worker #include "event-config.h"
163*6777b538SAndroid Build Coastguard Worker #ifdef _EVENT_HAVE_SYS_TYPES_H
164*6777b538SAndroid Build Coastguard Worker #include <sys/types.h>
165*6777b538SAndroid Build Coastguard Worker #endif
166*6777b538SAndroid Build Coastguard Worker #ifdef _EVENT_HAVE_SYS_TIME_H
167*6777b538SAndroid Build Coastguard Worker #include <sys/time.h>
168*6777b538SAndroid Build Coastguard Worker #endif
169*6777b538SAndroid Build Coastguard Worker #ifdef _EVENT_HAVE_STDINT_H
170*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
171*6777b538SAndroid Build Coastguard Worker #endif
172*6777b538SAndroid Build Coastguard Worker #include <stdarg.h>
173*6777b538SAndroid Build Coastguard Worker 
174*6777b538SAndroid Build Coastguard Worker /* For int types. */
175*6777b538SAndroid Build Coastguard Worker #include "evutil.h"
176*6777b538SAndroid Build Coastguard Worker 
177*6777b538SAndroid Build Coastguard Worker #ifdef WIN32
178*6777b538SAndroid Build Coastguard Worker #define WIN32_LEAN_AND_MEAN
179*6777b538SAndroid Build Coastguard Worker #include <windows.h>
180*6777b538SAndroid Build Coastguard Worker #undef WIN32_LEAN_AND_MEAN
181*6777b538SAndroid Build Coastguard Worker typedef unsigned char u_char;
182*6777b538SAndroid Build Coastguard Worker typedef unsigned short u_short;
183*6777b538SAndroid Build Coastguard Worker #endif
184*6777b538SAndroid Build Coastguard Worker 
185*6777b538SAndroid Build Coastguard Worker #define EVLIST_TIMEOUT	0x01
186*6777b538SAndroid Build Coastguard Worker #define EVLIST_INSERTED	0x02
187*6777b538SAndroid Build Coastguard Worker #define EVLIST_SIGNAL	0x04
188*6777b538SAndroid Build Coastguard Worker #define EVLIST_ACTIVE	0x08
189*6777b538SAndroid Build Coastguard Worker #define EVLIST_INTERNAL	0x10
190*6777b538SAndroid Build Coastguard Worker #define EVLIST_INIT	0x80
191*6777b538SAndroid Build Coastguard Worker 
192*6777b538SAndroid Build Coastguard Worker /* EVLIST_X_ Private space: 0x1000-0xf000 */
193*6777b538SAndroid Build Coastguard Worker #define EVLIST_ALL	(0xf000 | 0x9f)
194*6777b538SAndroid Build Coastguard Worker 
195*6777b538SAndroid Build Coastguard Worker #define EV_TIMEOUT	0x01
196*6777b538SAndroid Build Coastguard Worker #define EV_READ		0x02
197*6777b538SAndroid Build Coastguard Worker #define EV_WRITE	0x04
198*6777b538SAndroid Build Coastguard Worker #define EV_SIGNAL	0x08
199*6777b538SAndroid Build Coastguard Worker #define EV_PERSIST	0x10	/* Persistant event */
200*6777b538SAndroid Build Coastguard Worker 
201*6777b538SAndroid Build Coastguard Worker /* Fix so that ppl dont have to run with <sys/queue.h> */
202*6777b538SAndroid Build Coastguard Worker #ifndef TAILQ_ENTRY
203*6777b538SAndroid Build Coastguard Worker #define _EVENT_DEFINED_TQENTRY
204*6777b538SAndroid Build Coastguard Worker #define TAILQ_ENTRY(type)						\
205*6777b538SAndroid Build Coastguard Worker struct {								\
206*6777b538SAndroid Build Coastguard Worker 	struct type *tqe_next;	/* next element */			\
207*6777b538SAndroid Build Coastguard Worker 	struct type **tqe_prev;	/* address of previous next element */	\
208*6777b538SAndroid Build Coastguard Worker }
209*6777b538SAndroid Build Coastguard Worker #endif /* !TAILQ_ENTRY */
210*6777b538SAndroid Build Coastguard Worker 
211*6777b538SAndroid Build Coastguard Worker struct event_base;
212*6777b538SAndroid Build Coastguard Worker #ifndef EVENT_NO_STRUCT
213*6777b538SAndroid Build Coastguard Worker struct event {
214*6777b538SAndroid Build Coastguard Worker 	TAILQ_ENTRY (event) ev_next;
215*6777b538SAndroid Build Coastguard Worker 	TAILQ_ENTRY (event) ev_active_next;
216*6777b538SAndroid Build Coastguard Worker 	TAILQ_ENTRY (event) ev_signal_next;
217*6777b538SAndroid Build Coastguard Worker 	unsigned int min_heap_idx;	/* for managing timeouts */
218*6777b538SAndroid Build Coastguard Worker 
219*6777b538SAndroid Build Coastguard Worker 	struct event_base *ev_base;
220*6777b538SAndroid Build Coastguard Worker 
221*6777b538SAndroid Build Coastguard Worker 	int ev_fd;
222*6777b538SAndroid Build Coastguard Worker 	short ev_events;
223*6777b538SAndroid Build Coastguard Worker 	short ev_ncalls;
224*6777b538SAndroid Build Coastguard Worker 	short *ev_pncalls;	/* Allows deletes in callback */
225*6777b538SAndroid Build Coastguard Worker 
226*6777b538SAndroid Build Coastguard Worker 	struct timeval ev_timeout;
227*6777b538SAndroid Build Coastguard Worker 
228*6777b538SAndroid Build Coastguard Worker 	int ev_pri;		/* smaller numbers are higher priority */
229*6777b538SAndroid Build Coastguard Worker 
230*6777b538SAndroid Build Coastguard Worker 	void (*ev_callback)(int, short, void *arg);
231*6777b538SAndroid Build Coastguard Worker 	void *ev_arg;
232*6777b538SAndroid Build Coastguard Worker 
233*6777b538SAndroid Build Coastguard Worker 	int ev_res;		/* result passed to event callback */
234*6777b538SAndroid Build Coastguard Worker 	int ev_flags;
235*6777b538SAndroid Build Coastguard Worker };
236*6777b538SAndroid Build Coastguard Worker #else
237*6777b538SAndroid Build Coastguard Worker struct event;
238*6777b538SAndroid Build Coastguard Worker #endif
239*6777b538SAndroid Build Coastguard Worker 
240*6777b538SAndroid Build Coastguard Worker #define EVENT_SIGNAL(ev)	(int)(ev)->ev_fd
241*6777b538SAndroid Build Coastguard Worker #define EVENT_FD(ev)		(int)(ev)->ev_fd
242*6777b538SAndroid Build Coastguard Worker 
243*6777b538SAndroid Build Coastguard Worker /*
244*6777b538SAndroid Build Coastguard Worker  * Key-Value pairs.  Can be used for HTTP headers but also for
245*6777b538SAndroid Build Coastguard Worker  * query argument parsing.
246*6777b538SAndroid Build Coastguard Worker  */
247*6777b538SAndroid Build Coastguard Worker struct evkeyval {
248*6777b538SAndroid Build Coastguard Worker 	TAILQ_ENTRY(evkeyval) next;
249*6777b538SAndroid Build Coastguard Worker 
250*6777b538SAndroid Build Coastguard Worker 	char *key;
251*6777b538SAndroid Build Coastguard Worker 	char *value;
252*6777b538SAndroid Build Coastguard Worker };
253*6777b538SAndroid Build Coastguard Worker 
254*6777b538SAndroid Build Coastguard Worker #ifdef _EVENT_DEFINED_TQENTRY
255*6777b538SAndroid Build Coastguard Worker #undef TAILQ_ENTRY
256*6777b538SAndroid Build Coastguard Worker struct event_list;
257*6777b538SAndroid Build Coastguard Worker struct evkeyvalq;
258*6777b538SAndroid Build Coastguard Worker #undef _EVENT_DEFINED_TQENTRY
259*6777b538SAndroid Build Coastguard Worker #else
260*6777b538SAndroid Build Coastguard Worker TAILQ_HEAD (event_list, event);
261*6777b538SAndroid Build Coastguard Worker TAILQ_HEAD (evkeyvalq, evkeyval);
262*6777b538SAndroid Build Coastguard Worker #endif /* _EVENT_DEFINED_TQENTRY */
263*6777b538SAndroid Build Coastguard Worker 
264*6777b538SAndroid Build Coastguard Worker /**
265*6777b538SAndroid Build Coastguard Worker   Initialize the event API.
266*6777b538SAndroid Build Coastguard Worker 
267*6777b538SAndroid Build Coastguard Worker   Use event_base_new() to initialize a new event base, but does not set
268*6777b538SAndroid Build Coastguard Worker   the current_base global.   If using only event_base_new(), each event
269*6777b538SAndroid Build Coastguard Worker   added must have an event base set with event_base_set()
270*6777b538SAndroid Build Coastguard Worker 
271*6777b538SAndroid Build Coastguard Worker   @see event_base_set(), event_base_free(), event_init()
272*6777b538SAndroid Build Coastguard Worker  */
273*6777b538SAndroid Build Coastguard Worker struct event_base *event_base_new(void);
274*6777b538SAndroid Build Coastguard Worker 
275*6777b538SAndroid Build Coastguard Worker /**
276*6777b538SAndroid Build Coastguard Worker   Initialize the event API.
277*6777b538SAndroid Build Coastguard Worker 
278*6777b538SAndroid Build Coastguard Worker   The event API needs to be initialized with event_init() before it can be
279*6777b538SAndroid Build Coastguard Worker   used.  Sets the current_base global representing the default base for
280*6777b538SAndroid Build Coastguard Worker   events that have no base associated with them.
281*6777b538SAndroid Build Coastguard Worker 
282*6777b538SAndroid Build Coastguard Worker   @see event_base_set(), event_base_new()
283*6777b538SAndroid Build Coastguard Worker  */
284*6777b538SAndroid Build Coastguard Worker struct event_base *event_init(void);
285*6777b538SAndroid Build Coastguard Worker 
286*6777b538SAndroid Build Coastguard Worker /**
287*6777b538SAndroid Build Coastguard Worker   Reinitialized the event base after a fork
288*6777b538SAndroid Build Coastguard Worker 
289*6777b538SAndroid Build Coastguard Worker   Some event mechanisms do not survive across fork.   The event base needs
290*6777b538SAndroid Build Coastguard Worker   to be reinitialized with the event_reinit() function.
291*6777b538SAndroid Build Coastguard Worker 
292*6777b538SAndroid Build Coastguard Worker   @param base the event base that needs to be re-initialized
293*6777b538SAndroid Build Coastguard Worker   @return 0 if successful, or -1 if some events could not be re-added.
294*6777b538SAndroid Build Coastguard Worker   @see event_base_new(), event_init()
295*6777b538SAndroid Build Coastguard Worker */
296*6777b538SAndroid Build Coastguard Worker int event_reinit(struct event_base *base);
297*6777b538SAndroid Build Coastguard Worker 
298*6777b538SAndroid Build Coastguard Worker /**
299*6777b538SAndroid Build Coastguard Worker   Loop to process events.
300*6777b538SAndroid Build Coastguard Worker 
301*6777b538SAndroid Build Coastguard Worker   In order to process events, an application needs to call
302*6777b538SAndroid Build Coastguard Worker   event_dispatch().  This function only returns on error, and should
303*6777b538SAndroid Build Coastguard Worker   replace the event core of the application program.
304*6777b538SAndroid Build Coastguard Worker 
305*6777b538SAndroid Build Coastguard Worker   @see event_base_dispatch()
306*6777b538SAndroid Build Coastguard Worker  */
307*6777b538SAndroid Build Coastguard Worker int event_dispatch(void);
308*6777b538SAndroid Build Coastguard Worker 
309*6777b538SAndroid Build Coastguard Worker 
310*6777b538SAndroid Build Coastguard Worker /**
311*6777b538SAndroid Build Coastguard Worker   Threadsafe event dispatching loop.
312*6777b538SAndroid Build Coastguard Worker 
313*6777b538SAndroid Build Coastguard Worker   @param eb the event_base structure returned by event_init()
314*6777b538SAndroid Build Coastguard Worker   @see event_init(), event_dispatch()
315*6777b538SAndroid Build Coastguard Worker  */
316*6777b538SAndroid Build Coastguard Worker int event_base_dispatch(struct event_base *);
317*6777b538SAndroid Build Coastguard Worker 
318*6777b538SAndroid Build Coastguard Worker 
319*6777b538SAndroid Build Coastguard Worker /**
320*6777b538SAndroid Build Coastguard Worker  Get the kernel event notification mechanism used by libevent.
321*6777b538SAndroid Build Coastguard Worker 
322*6777b538SAndroid Build Coastguard Worker  @param eb the event_base structure returned by event_base_new()
323*6777b538SAndroid Build Coastguard Worker  @return a string identifying the kernel event mechanism (kqueue, epoll, etc.)
324*6777b538SAndroid Build Coastguard Worker  */
325*6777b538SAndroid Build Coastguard Worker const char *event_base_get_method(struct event_base *);
326*6777b538SAndroid Build Coastguard Worker 
327*6777b538SAndroid Build Coastguard Worker 
328*6777b538SAndroid Build Coastguard Worker /**
329*6777b538SAndroid Build Coastguard Worker   Deallocate all memory associated with an event_base, and free the base.
330*6777b538SAndroid Build Coastguard Worker 
331*6777b538SAndroid Build Coastguard Worker   Note that this function will not close any fds or free any memory passed
332*6777b538SAndroid Build Coastguard Worker   to event_set as the argument to callback.
333*6777b538SAndroid Build Coastguard Worker 
334*6777b538SAndroid Build Coastguard Worker   @param eb an event_base to be freed
335*6777b538SAndroid Build Coastguard Worker  */
336*6777b538SAndroid Build Coastguard Worker void event_base_free(struct event_base *);
337*6777b538SAndroid Build Coastguard Worker 
338*6777b538SAndroid Build Coastguard Worker 
339*6777b538SAndroid Build Coastguard Worker #define _EVENT_LOG_DEBUG 0
340*6777b538SAndroid Build Coastguard Worker #define _EVENT_LOG_MSG   1
341*6777b538SAndroid Build Coastguard Worker #define _EVENT_LOG_WARN  2
342*6777b538SAndroid Build Coastguard Worker #define _EVENT_LOG_ERR   3
343*6777b538SAndroid Build Coastguard Worker typedef void (*event_log_cb)(int severity, const char *msg);
344*6777b538SAndroid Build Coastguard Worker /**
345*6777b538SAndroid Build Coastguard Worker   Redirect libevent's log messages.
346*6777b538SAndroid Build Coastguard Worker 
347*6777b538SAndroid Build Coastguard Worker   @param cb a function taking two arguments: an integer severity between
348*6777b538SAndroid Build Coastguard Worker      _EVENT_LOG_DEBUG and _EVENT_LOG_ERR, and a string.  If cb is NULL,
349*6777b538SAndroid Build Coastguard Worker 	 then the default log is used.
350*6777b538SAndroid Build Coastguard Worker   */
351*6777b538SAndroid Build Coastguard Worker void event_set_log_callback(event_log_cb cb);
352*6777b538SAndroid Build Coastguard Worker 
353*6777b538SAndroid Build Coastguard Worker /**
354*6777b538SAndroid Build Coastguard Worker   Associate a different event base with an event.
355*6777b538SAndroid Build Coastguard Worker 
356*6777b538SAndroid Build Coastguard Worker   @param eb the event base
357*6777b538SAndroid Build Coastguard Worker   @param ev the event
358*6777b538SAndroid Build Coastguard Worker  */
359*6777b538SAndroid Build Coastguard Worker int event_base_set(struct event_base *, struct event *);
360*6777b538SAndroid Build Coastguard Worker 
361*6777b538SAndroid Build Coastguard Worker /**
362*6777b538SAndroid Build Coastguard Worker  event_loop() flags
363*6777b538SAndroid Build Coastguard Worker  */
364*6777b538SAndroid Build Coastguard Worker /*@{*/
365*6777b538SAndroid Build Coastguard Worker #define EVLOOP_ONCE	0x01	/**< Block at most once. */
366*6777b538SAndroid Build Coastguard Worker #define EVLOOP_NONBLOCK	0x02	/**< Do not block. */
367*6777b538SAndroid Build Coastguard Worker /*@}*/
368*6777b538SAndroid Build Coastguard Worker 
369*6777b538SAndroid Build Coastguard Worker /**
370*6777b538SAndroid Build Coastguard Worker   Handle events.
371*6777b538SAndroid Build Coastguard Worker 
372*6777b538SAndroid Build Coastguard Worker   This is a more flexible version of event_dispatch().
373*6777b538SAndroid Build Coastguard Worker 
374*6777b538SAndroid Build Coastguard Worker   @param flags any combination of EVLOOP_ONCE | EVLOOP_NONBLOCK
375*6777b538SAndroid Build Coastguard Worker   @return 0 if successful, -1 if an error occurred, or 1 if no events were
376*6777b538SAndroid Build Coastguard Worker     registered.
377*6777b538SAndroid Build Coastguard Worker   @see event_loopexit(), event_base_loop()
378*6777b538SAndroid Build Coastguard Worker */
379*6777b538SAndroid Build Coastguard Worker int event_loop(int);
380*6777b538SAndroid Build Coastguard Worker 
381*6777b538SAndroid Build Coastguard Worker /**
382*6777b538SAndroid Build Coastguard Worker   Handle events (threadsafe version).
383*6777b538SAndroid Build Coastguard Worker 
384*6777b538SAndroid Build Coastguard Worker   This is a more flexible version of event_base_dispatch().
385*6777b538SAndroid Build Coastguard Worker 
386*6777b538SAndroid Build Coastguard Worker   @param eb the event_base structure returned by event_init()
387*6777b538SAndroid Build Coastguard Worker   @param flags any combination of EVLOOP_ONCE | EVLOOP_NONBLOCK
388*6777b538SAndroid Build Coastguard Worker   @return 0 if successful, -1 if an error occurred, or 1 if no events were
389*6777b538SAndroid Build Coastguard Worker     registered.
390*6777b538SAndroid Build Coastguard Worker   @see event_loopexit(), event_base_loop()
391*6777b538SAndroid Build Coastguard Worker   */
392*6777b538SAndroid Build Coastguard Worker int event_base_loop(struct event_base *, int);
393*6777b538SAndroid Build Coastguard Worker 
394*6777b538SAndroid Build Coastguard Worker /**
395*6777b538SAndroid Build Coastguard Worker   Exit the event loop after the specified time.
396*6777b538SAndroid Build Coastguard Worker 
397*6777b538SAndroid Build Coastguard Worker   The next event_loop() iteration after the given timer expires will
398*6777b538SAndroid Build Coastguard Worker   complete normally (handling all queued events) then exit without
399*6777b538SAndroid Build Coastguard Worker   blocking for events again.
400*6777b538SAndroid Build Coastguard Worker 
401*6777b538SAndroid Build Coastguard Worker   Subsequent invocations of event_loop() will proceed normally.
402*6777b538SAndroid Build Coastguard Worker 
403*6777b538SAndroid Build Coastguard Worker   @param tv the amount of time after which the loop should terminate.
404*6777b538SAndroid Build Coastguard Worker   @return 0 if successful, or -1 if an error occurred
405*6777b538SAndroid Build Coastguard Worker   @see event_loop(), event_base_loop(), event_base_loopexit()
406*6777b538SAndroid Build Coastguard Worker   */
407*6777b538SAndroid Build Coastguard Worker int event_loopexit(const struct timeval *);
408*6777b538SAndroid Build Coastguard Worker 
409*6777b538SAndroid Build Coastguard Worker 
410*6777b538SAndroid Build Coastguard Worker /**
411*6777b538SAndroid Build Coastguard Worker   Exit the event loop after the specified time (threadsafe variant).
412*6777b538SAndroid Build Coastguard Worker 
413*6777b538SAndroid Build Coastguard Worker   The next event_base_loop() iteration after the given timer expires will
414*6777b538SAndroid Build Coastguard Worker   complete normally (handling all queued events) then exit without
415*6777b538SAndroid Build Coastguard Worker   blocking for events again.
416*6777b538SAndroid Build Coastguard Worker 
417*6777b538SAndroid Build Coastguard Worker   Subsequent invocations of event_base_loop() will proceed normally.
418*6777b538SAndroid Build Coastguard Worker 
419*6777b538SAndroid Build Coastguard Worker   @param eb the event_base structure returned by event_init()
420*6777b538SAndroid Build Coastguard Worker   @param tv the amount of time after which the loop should terminate.
421*6777b538SAndroid Build Coastguard Worker   @return 0 if successful, or -1 if an error occurred
422*6777b538SAndroid Build Coastguard Worker   @see event_loopexit()
423*6777b538SAndroid Build Coastguard Worker  */
424*6777b538SAndroid Build Coastguard Worker int event_base_loopexit(struct event_base *, const struct timeval *);
425*6777b538SAndroid Build Coastguard Worker 
426*6777b538SAndroid Build Coastguard Worker /**
427*6777b538SAndroid Build Coastguard Worker   Abort the active event_loop() immediately.
428*6777b538SAndroid Build Coastguard Worker 
429*6777b538SAndroid Build Coastguard Worker   event_loop() will abort the loop after the next event is completed;
430*6777b538SAndroid Build Coastguard Worker   event_loopbreak() is typically invoked from this event's callback.
431*6777b538SAndroid Build Coastguard Worker   This behavior is analogous to the "break;" statement.
432*6777b538SAndroid Build Coastguard Worker 
433*6777b538SAndroid Build Coastguard Worker   Subsequent invocations of event_loop() will proceed normally.
434*6777b538SAndroid Build Coastguard Worker 
435*6777b538SAndroid Build Coastguard Worker   @return 0 if successful, or -1 if an error occurred
436*6777b538SAndroid Build Coastguard Worker   @see event_base_loopbreak(), event_loopexit()
437*6777b538SAndroid Build Coastguard Worker  */
438*6777b538SAndroid Build Coastguard Worker int event_loopbreak(void);
439*6777b538SAndroid Build Coastguard Worker 
440*6777b538SAndroid Build Coastguard Worker /**
441*6777b538SAndroid Build Coastguard Worker   Abort the active event_base_loop() immediately.
442*6777b538SAndroid Build Coastguard Worker 
443*6777b538SAndroid Build Coastguard Worker   event_base_loop() will abort the loop after the next event is completed;
444*6777b538SAndroid Build Coastguard Worker   event_base_loopbreak() is typically invoked from this event's callback.
445*6777b538SAndroid Build Coastguard Worker   This behavior is analogous to the "break;" statement.
446*6777b538SAndroid Build Coastguard Worker 
447*6777b538SAndroid Build Coastguard Worker   Subsequent invocations of event_loop() will proceed normally.
448*6777b538SAndroid Build Coastguard Worker 
449*6777b538SAndroid Build Coastguard Worker   @param eb the event_base structure returned by event_init()
450*6777b538SAndroid Build Coastguard Worker   @return 0 if successful, or -1 if an error occurred
451*6777b538SAndroid Build Coastguard Worker   @see event_base_loopexit
452*6777b538SAndroid Build Coastguard Worker  */
453*6777b538SAndroid Build Coastguard Worker int event_base_loopbreak(struct event_base *);
454*6777b538SAndroid Build Coastguard Worker 
455*6777b538SAndroid Build Coastguard Worker 
456*6777b538SAndroid Build Coastguard Worker /**
457*6777b538SAndroid Build Coastguard Worker   Add a timer event.
458*6777b538SAndroid Build Coastguard Worker 
459*6777b538SAndroid Build Coastguard Worker   @param ev the event struct
460*6777b538SAndroid Build Coastguard Worker   @param tv timeval struct
461*6777b538SAndroid Build Coastguard Worker  */
462*6777b538SAndroid Build Coastguard Worker #define evtimer_add(ev, tv)		event_add(ev, tv)
463*6777b538SAndroid Build Coastguard Worker 
464*6777b538SAndroid Build Coastguard Worker 
465*6777b538SAndroid Build Coastguard Worker /**
466*6777b538SAndroid Build Coastguard Worker   Define a timer event.
467*6777b538SAndroid Build Coastguard Worker 
468*6777b538SAndroid Build Coastguard Worker   @param ev event struct to be modified
469*6777b538SAndroid Build Coastguard Worker   @param cb callback function
470*6777b538SAndroid Build Coastguard Worker   @param arg argument that will be passed to the callback function
471*6777b538SAndroid Build Coastguard Worker  */
472*6777b538SAndroid Build Coastguard Worker #define evtimer_set(ev, cb, arg)	event_set(ev, -1, 0, cb, arg)
473*6777b538SAndroid Build Coastguard Worker 
474*6777b538SAndroid Build Coastguard Worker 
475*6777b538SAndroid Build Coastguard Worker /**
476*6777b538SAndroid Build Coastguard Worker  * Delete a timer event.
477*6777b538SAndroid Build Coastguard Worker  *
478*6777b538SAndroid Build Coastguard Worker  * @param ev the event struct to be disabled
479*6777b538SAndroid Build Coastguard Worker  */
480*6777b538SAndroid Build Coastguard Worker #define evtimer_del(ev)			event_del(ev)
481*6777b538SAndroid Build Coastguard Worker #define evtimer_pending(ev, tv)		event_pending(ev, EV_TIMEOUT, tv)
482*6777b538SAndroid Build Coastguard Worker #define evtimer_initialized(ev)		((ev)->ev_flags & EVLIST_INIT)
483*6777b538SAndroid Build Coastguard Worker 
484*6777b538SAndroid Build Coastguard Worker /**
485*6777b538SAndroid Build Coastguard Worker  * Add a timeout event.
486*6777b538SAndroid Build Coastguard Worker  *
487*6777b538SAndroid Build Coastguard Worker  * @param ev the event struct to be disabled
488*6777b538SAndroid Build Coastguard Worker  * @param tv the timeout value, in seconds
489*6777b538SAndroid Build Coastguard Worker  */
490*6777b538SAndroid Build Coastguard Worker #define timeout_add(ev, tv)		event_add(ev, tv)
491*6777b538SAndroid Build Coastguard Worker 
492*6777b538SAndroid Build Coastguard Worker 
493*6777b538SAndroid Build Coastguard Worker /**
494*6777b538SAndroid Build Coastguard Worker  * Define a timeout event.
495*6777b538SAndroid Build Coastguard Worker  *
496*6777b538SAndroid Build Coastguard Worker  * @param ev the event struct to be defined
497*6777b538SAndroid Build Coastguard Worker  * @param cb the callback to be invoked when the timeout expires
498*6777b538SAndroid Build Coastguard Worker  * @param arg the argument to be passed to the callback
499*6777b538SAndroid Build Coastguard Worker  */
500*6777b538SAndroid Build Coastguard Worker #define timeout_set(ev, cb, arg)	event_set(ev, -1, 0, cb, arg)
501*6777b538SAndroid Build Coastguard Worker 
502*6777b538SAndroid Build Coastguard Worker 
503*6777b538SAndroid Build Coastguard Worker /**
504*6777b538SAndroid Build Coastguard Worker  * Disable a timeout event.
505*6777b538SAndroid Build Coastguard Worker  *
506*6777b538SAndroid Build Coastguard Worker  * @param ev the timeout event to be disabled
507*6777b538SAndroid Build Coastguard Worker  */
508*6777b538SAndroid Build Coastguard Worker #define timeout_del(ev)			event_del(ev)
509*6777b538SAndroid Build Coastguard Worker 
510*6777b538SAndroid Build Coastguard Worker #define timeout_pending(ev, tv)		event_pending(ev, EV_TIMEOUT, tv)
511*6777b538SAndroid Build Coastguard Worker #define timeout_initialized(ev)		((ev)->ev_flags & EVLIST_INIT)
512*6777b538SAndroid Build Coastguard Worker 
513*6777b538SAndroid Build Coastguard Worker #define signal_add(ev, tv)		event_add(ev, tv)
514*6777b538SAndroid Build Coastguard Worker #define signal_set(ev, x, cb, arg)	\
515*6777b538SAndroid Build Coastguard Worker 	event_set(ev, x, EV_SIGNAL|EV_PERSIST, cb, arg)
516*6777b538SAndroid Build Coastguard Worker #define signal_del(ev)			event_del(ev)
517*6777b538SAndroid Build Coastguard Worker #define signal_pending(ev, tv)		event_pending(ev, EV_SIGNAL, tv)
518*6777b538SAndroid Build Coastguard Worker #define signal_initialized(ev)		((ev)->ev_flags & EVLIST_INIT)
519*6777b538SAndroid Build Coastguard Worker 
520*6777b538SAndroid Build Coastguard Worker /**
521*6777b538SAndroid Build Coastguard Worker   Prepare an event structure to be added.
522*6777b538SAndroid Build Coastguard Worker 
523*6777b538SAndroid Build Coastguard Worker   The function event_set() prepares the event structure ev to be used in
524*6777b538SAndroid Build Coastguard Worker   future calls to event_add() and event_del().  The event will be prepared to
525*6777b538SAndroid Build Coastguard Worker   call the function specified by the fn argument with an int argument
526*6777b538SAndroid Build Coastguard Worker   indicating the file descriptor, a short argument indicating the type of
527*6777b538SAndroid Build Coastguard Worker   event, and a void * argument given in the arg argument.  The fd indicates
528*6777b538SAndroid Build Coastguard Worker   the file descriptor that should be monitored for events.  The events can be
529*6777b538SAndroid Build Coastguard Worker   either EV_READ, EV_WRITE, or both.  Indicating that an application can read
530*6777b538SAndroid Build Coastguard Worker   or write from the file descriptor respectively without blocking.
531*6777b538SAndroid Build Coastguard Worker 
532*6777b538SAndroid Build Coastguard Worker   The function fn will be called with the file descriptor that triggered the
533*6777b538SAndroid Build Coastguard Worker   event and the type of event which will be either EV_TIMEOUT, EV_SIGNAL,
534*6777b538SAndroid Build Coastguard Worker   EV_READ, or EV_WRITE.  The additional flag EV_PERSIST makes an event_add()
535*6777b538SAndroid Build Coastguard Worker   persistent until event_del() has been called.
536*6777b538SAndroid Build Coastguard Worker 
537*6777b538SAndroid Build Coastguard Worker   @param ev an event struct to be modified
538*6777b538SAndroid Build Coastguard Worker   @param fd the file descriptor to be monitored
539*6777b538SAndroid Build Coastguard Worker   @param event desired events to monitor; can be EV_READ and/or EV_WRITE
540*6777b538SAndroid Build Coastguard Worker   @param fn callback function to be invoked when the event occurs
541*6777b538SAndroid Build Coastguard Worker   @param arg an argument to be passed to the callback function
542*6777b538SAndroid Build Coastguard Worker 
543*6777b538SAndroid Build Coastguard Worker   @see event_add(), event_del(), event_once()
544*6777b538SAndroid Build Coastguard Worker 
545*6777b538SAndroid Build Coastguard Worker  */
546*6777b538SAndroid Build Coastguard Worker void event_set(struct event *, int, short, void (*)(int, short, void *), void *);
547*6777b538SAndroid Build Coastguard Worker 
548*6777b538SAndroid Build Coastguard Worker /**
549*6777b538SAndroid Build Coastguard Worker   Schedule a one-time event to occur.
550*6777b538SAndroid Build Coastguard Worker 
551*6777b538SAndroid Build Coastguard Worker   The function event_once() is similar to event_set().  However, it schedules
552*6777b538SAndroid Build Coastguard Worker   a callback to be called exactly once and does not require the caller to
553*6777b538SAndroid Build Coastguard Worker   prepare an event structure.
554*6777b538SAndroid Build Coastguard Worker 
555*6777b538SAndroid Build Coastguard Worker   @param fd a file descriptor to monitor
556*6777b538SAndroid Build Coastguard Worker   @param events event(s) to monitor; can be any of EV_TIMEOUT | EV_READ |
557*6777b538SAndroid Build Coastguard Worker          EV_WRITE
558*6777b538SAndroid Build Coastguard Worker   @param callback callback function to be invoked when the event occurs
559*6777b538SAndroid Build Coastguard Worker   @param arg an argument to be passed to the callback function
560*6777b538SAndroid Build Coastguard Worker   @param timeout the maximum amount of time to wait for the event, or NULL
561*6777b538SAndroid Build Coastguard Worker          to wait forever
562*6777b538SAndroid Build Coastguard Worker   @return 0 if successful, or -1 if an error occurred
563*6777b538SAndroid Build Coastguard Worker   @see event_set()
564*6777b538SAndroid Build Coastguard Worker 
565*6777b538SAndroid Build Coastguard Worker  */
566*6777b538SAndroid Build Coastguard Worker int event_once(int, short, void (*)(int, short, void *), void *,
567*6777b538SAndroid Build Coastguard Worker     const struct timeval *);
568*6777b538SAndroid Build Coastguard Worker 
569*6777b538SAndroid Build Coastguard Worker 
570*6777b538SAndroid Build Coastguard Worker /**
571*6777b538SAndroid Build Coastguard Worker   Schedule a one-time event (threadsafe variant)
572*6777b538SAndroid Build Coastguard Worker 
573*6777b538SAndroid Build Coastguard Worker   The function event_base_once() is similar to event_set().  However, it
574*6777b538SAndroid Build Coastguard Worker   schedules a callback to be called exactly once and does not require the
575*6777b538SAndroid Build Coastguard Worker   caller to prepare an event structure.
576*6777b538SAndroid Build Coastguard Worker 
577*6777b538SAndroid Build Coastguard Worker   @param base an event_base returned by event_init()
578*6777b538SAndroid Build Coastguard Worker   @param fd a file descriptor to monitor
579*6777b538SAndroid Build Coastguard Worker   @param events event(s) to monitor; can be any of EV_TIMEOUT | EV_READ |
580*6777b538SAndroid Build Coastguard Worker          EV_WRITE
581*6777b538SAndroid Build Coastguard Worker   @param callback callback function to be invoked when the event occurs
582*6777b538SAndroid Build Coastguard Worker   @param arg an argument to be passed to the callback function
583*6777b538SAndroid Build Coastguard Worker   @param timeout the maximum amount of time to wait for the event, or NULL
584*6777b538SAndroid Build Coastguard Worker          to wait forever
585*6777b538SAndroid Build Coastguard Worker   @return 0 if successful, or -1 if an error occurred
586*6777b538SAndroid Build Coastguard Worker   @see event_once()
587*6777b538SAndroid Build Coastguard Worker  */
588*6777b538SAndroid Build Coastguard Worker int event_base_once(struct event_base *base, int fd, short events,
589*6777b538SAndroid Build Coastguard Worker     void (*callback)(int, short, void *), void *arg,
590*6777b538SAndroid Build Coastguard Worker     const struct timeval *timeout);
591*6777b538SAndroid Build Coastguard Worker 
592*6777b538SAndroid Build Coastguard Worker 
593*6777b538SAndroid Build Coastguard Worker /**
594*6777b538SAndroid Build Coastguard Worker   Add an event to the set of monitored events.
595*6777b538SAndroid Build Coastguard Worker 
596*6777b538SAndroid Build Coastguard Worker   The function event_add() schedules the execution of the ev event when the
597*6777b538SAndroid Build Coastguard Worker   event specified in event_set() occurs or in at least the time specified in
598*6777b538SAndroid Build Coastguard Worker   the tv.  If tv is NULL, no timeout occurs and the function will only be
599*6777b538SAndroid Build Coastguard Worker   called if a matching event occurs on the file descriptor.  The event in the
600*6777b538SAndroid Build Coastguard Worker   ev argument must be already initialized by event_set() and may not be used
601*6777b538SAndroid Build Coastguard Worker   in calls to event_set() until it has timed out or been removed with
602*6777b538SAndroid Build Coastguard Worker   event_del().  If the event in the ev argument already has a scheduled
603*6777b538SAndroid Build Coastguard Worker   timeout, the old timeout will be replaced by the new one.
604*6777b538SAndroid Build Coastguard Worker 
605*6777b538SAndroid Build Coastguard Worker   @param ev an event struct initialized via event_set()
606*6777b538SAndroid Build Coastguard Worker   @param timeout the maximum amount of time to wait for the event, or NULL
607*6777b538SAndroid Build Coastguard Worker          to wait forever
608*6777b538SAndroid Build Coastguard Worker   @return 0 if successful, or -1 if an error occurred
609*6777b538SAndroid Build Coastguard Worker   @see event_del(), event_set()
610*6777b538SAndroid Build Coastguard Worker   */
611*6777b538SAndroid Build Coastguard Worker int event_add(struct event *ev, const struct timeval *timeout);
612*6777b538SAndroid Build Coastguard Worker 
613*6777b538SAndroid Build Coastguard Worker 
614*6777b538SAndroid Build Coastguard Worker /**
615*6777b538SAndroid Build Coastguard Worker   Remove an event from the set of monitored events.
616*6777b538SAndroid Build Coastguard Worker 
617*6777b538SAndroid Build Coastguard Worker   The function event_del() will cancel the event in the argument ev.  If the
618*6777b538SAndroid Build Coastguard Worker   event has already executed or has never been added the call will have no
619*6777b538SAndroid Build Coastguard Worker   effect.
620*6777b538SAndroid Build Coastguard Worker 
621*6777b538SAndroid Build Coastguard Worker   @param ev an event struct to be removed from the working set
622*6777b538SAndroid Build Coastguard Worker   @return 0 if successful, or -1 if an error occurred
623*6777b538SAndroid Build Coastguard Worker   @see event_add()
624*6777b538SAndroid Build Coastguard Worker  */
625*6777b538SAndroid Build Coastguard Worker int event_del(struct event *);
626*6777b538SAndroid Build Coastguard Worker 
627*6777b538SAndroid Build Coastguard Worker void event_active(struct event *, int, short);
628*6777b538SAndroid Build Coastguard Worker 
629*6777b538SAndroid Build Coastguard Worker 
630*6777b538SAndroid Build Coastguard Worker /**
631*6777b538SAndroid Build Coastguard Worker   Checks if a specific event is pending or scheduled.
632*6777b538SAndroid Build Coastguard Worker 
633*6777b538SAndroid Build Coastguard Worker   @param ev an event struct previously passed to event_add()
634*6777b538SAndroid Build Coastguard Worker   @param event the requested event type; any of EV_TIMEOUT|EV_READ|
635*6777b538SAndroid Build Coastguard Worker          EV_WRITE|EV_SIGNAL
636*6777b538SAndroid Build Coastguard Worker   @param tv an alternate timeout (FIXME - is this true?)
637*6777b538SAndroid Build Coastguard Worker 
638*6777b538SAndroid Build Coastguard Worker   @return 1 if the event is pending, or 0 if the event has not occurred
639*6777b538SAndroid Build Coastguard Worker 
640*6777b538SAndroid Build Coastguard Worker  */
641*6777b538SAndroid Build Coastguard Worker int event_pending(struct event *ev, short event, struct timeval *tv);
642*6777b538SAndroid Build Coastguard Worker 
643*6777b538SAndroid Build Coastguard Worker 
644*6777b538SAndroid Build Coastguard Worker /**
645*6777b538SAndroid Build Coastguard Worker   Test if an event structure has been initialized.
646*6777b538SAndroid Build Coastguard Worker 
647*6777b538SAndroid Build Coastguard Worker   The event_initialized() macro can be used to check if an event has been
648*6777b538SAndroid Build Coastguard Worker   initialized.
649*6777b538SAndroid Build Coastguard Worker 
650*6777b538SAndroid Build Coastguard Worker   @param ev an event structure to be tested
651*6777b538SAndroid Build Coastguard Worker   @return 1 if the structure has been initialized, or 0 if it has not been
652*6777b538SAndroid Build Coastguard Worker           initialized
653*6777b538SAndroid Build Coastguard Worker  */
654*6777b538SAndroid Build Coastguard Worker #ifdef WIN32
655*6777b538SAndroid Build Coastguard Worker #define event_initialized(ev)		((ev)->ev_flags & EVLIST_INIT && (ev)->ev_fd != (int)INVALID_HANDLE_VALUE)
656*6777b538SAndroid Build Coastguard Worker #else
657*6777b538SAndroid Build Coastguard Worker #define event_initialized(ev)		((ev)->ev_flags & EVLIST_INIT)
658*6777b538SAndroid Build Coastguard Worker #endif
659*6777b538SAndroid Build Coastguard Worker 
660*6777b538SAndroid Build Coastguard Worker 
661*6777b538SAndroid Build Coastguard Worker /**
662*6777b538SAndroid Build Coastguard Worker   Get the libevent version number.
663*6777b538SAndroid Build Coastguard Worker 
664*6777b538SAndroid Build Coastguard Worker   @return a string containing the version number of libevent
665*6777b538SAndroid Build Coastguard Worker  */
666*6777b538SAndroid Build Coastguard Worker const char *event_get_version(void);
667*6777b538SAndroid Build Coastguard Worker 
668*6777b538SAndroid Build Coastguard Worker 
669*6777b538SAndroid Build Coastguard Worker /**
670*6777b538SAndroid Build Coastguard Worker   Get the kernel event notification mechanism used by libevent.
671*6777b538SAndroid Build Coastguard Worker 
672*6777b538SAndroid Build Coastguard Worker   @return a string identifying the kernel event mechanism (kqueue, epoll, etc.)
673*6777b538SAndroid Build Coastguard Worker  */
674*6777b538SAndroid Build Coastguard Worker const char *event_get_method(void);
675*6777b538SAndroid Build Coastguard Worker 
676*6777b538SAndroid Build Coastguard Worker 
677*6777b538SAndroid Build Coastguard Worker /**
678*6777b538SAndroid Build Coastguard Worker   Set the number of different event priorities.
679*6777b538SAndroid Build Coastguard Worker 
680*6777b538SAndroid Build Coastguard Worker   By default libevent schedules all active events with the same priority.
681*6777b538SAndroid Build Coastguard Worker   However, some time it is desirable to process some events with a higher
682*6777b538SAndroid Build Coastguard Worker   priority than others.  For that reason, libevent supports strict priority
683*6777b538SAndroid Build Coastguard Worker   queues.  Active events with a lower priority are always processed before
684*6777b538SAndroid Build Coastguard Worker   events with a higher priority.
685*6777b538SAndroid Build Coastguard Worker 
686*6777b538SAndroid Build Coastguard Worker   The number of different priorities can be set initially with the
687*6777b538SAndroid Build Coastguard Worker   event_priority_init() function.  This function should be called before the
688*6777b538SAndroid Build Coastguard Worker   first call to event_dispatch().  The event_priority_set() function can be
689*6777b538SAndroid Build Coastguard Worker   used to assign a priority to an event.  By default, libevent assigns the
690*6777b538SAndroid Build Coastguard Worker   middle priority to all events unless their priority is explicitly set.
691*6777b538SAndroid Build Coastguard Worker 
692*6777b538SAndroid Build Coastguard Worker   @param npriorities the maximum number of priorities
693*6777b538SAndroid Build Coastguard Worker   @return 0 if successful, or -1 if an error occurred
694*6777b538SAndroid Build Coastguard Worker   @see event_base_priority_init(), event_priority_set()
695*6777b538SAndroid Build Coastguard Worker 
696*6777b538SAndroid Build Coastguard Worker  */
697*6777b538SAndroid Build Coastguard Worker int	event_priority_init(int);
698*6777b538SAndroid Build Coastguard Worker 
699*6777b538SAndroid Build Coastguard Worker 
700*6777b538SAndroid Build Coastguard Worker /**
701*6777b538SAndroid Build Coastguard Worker   Set the number of different event priorities (threadsafe variant).
702*6777b538SAndroid Build Coastguard Worker 
703*6777b538SAndroid Build Coastguard Worker   See the description of event_priority_init() for more information.
704*6777b538SAndroid Build Coastguard Worker 
705*6777b538SAndroid Build Coastguard Worker   @param eb the event_base structure returned by event_init()
706*6777b538SAndroid Build Coastguard Worker   @param npriorities the maximum number of priorities
707*6777b538SAndroid Build Coastguard Worker   @return 0 if successful, or -1 if an error occurred
708*6777b538SAndroid Build Coastguard Worker   @see event_priority_init(), event_priority_set()
709*6777b538SAndroid Build Coastguard Worker  */
710*6777b538SAndroid Build Coastguard Worker int	event_base_priority_init(struct event_base *, int);
711*6777b538SAndroid Build Coastguard Worker 
712*6777b538SAndroid Build Coastguard Worker 
713*6777b538SAndroid Build Coastguard Worker /**
714*6777b538SAndroid Build Coastguard Worker   Assign a priority to an event.
715*6777b538SAndroid Build Coastguard Worker 
716*6777b538SAndroid Build Coastguard Worker   @param ev an event struct
717*6777b538SAndroid Build Coastguard Worker   @param priority the new priority to be assigned
718*6777b538SAndroid Build Coastguard Worker   @return 0 if successful, or -1 if an error occurred
719*6777b538SAndroid Build Coastguard Worker   @see event_priority_init()
720*6777b538SAndroid Build Coastguard Worker   */
721*6777b538SAndroid Build Coastguard Worker int	event_priority_set(struct event *, int);
722*6777b538SAndroid Build Coastguard Worker 
723*6777b538SAndroid Build Coastguard Worker #ifdef __cplusplus
724*6777b538SAndroid Build Coastguard Worker }
725*6777b538SAndroid Build Coastguard Worker #endif
726*6777b538SAndroid Build Coastguard Worker 
727*6777b538SAndroid Build Coastguard Worker #endif /* _EVENT_H_ */
728