xref: /aosp_15_r20/external/libevent/event-internal.h (revision 663afb9b963571284e0f0a60f257164ab54f64bf)
1*663afb9bSAndroid Build Coastguard Worker /*
2*663afb9bSAndroid Build Coastguard Worker  * Copyright (c) 2000-2007 Niels Provos <[email protected]>
3*663afb9bSAndroid Build Coastguard Worker  * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
4*663afb9bSAndroid Build Coastguard Worker  *
5*663afb9bSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
6*663afb9bSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
7*663afb9bSAndroid Build Coastguard Worker  * are met:
8*663afb9bSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
9*663afb9bSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
10*663afb9bSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
11*663afb9bSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
12*663afb9bSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
13*663afb9bSAndroid Build Coastguard Worker  * 3. The name of the author may not be used to endorse or promote products
14*663afb9bSAndroid Build Coastguard Worker  *    derived from this software without specific prior written permission.
15*663afb9bSAndroid Build Coastguard Worker  *
16*663afb9bSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17*663afb9bSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18*663afb9bSAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19*663afb9bSAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20*663afb9bSAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21*663afb9bSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22*663afb9bSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23*663afb9bSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24*663afb9bSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25*663afb9bSAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*663afb9bSAndroid Build Coastguard Worker  */
27*663afb9bSAndroid Build Coastguard Worker #ifndef EVENT_INTERNAL_H_INCLUDED_
28*663afb9bSAndroid Build Coastguard Worker #define EVENT_INTERNAL_H_INCLUDED_
29*663afb9bSAndroid Build Coastguard Worker 
30*663afb9bSAndroid Build Coastguard Worker #ifdef __cplusplus
31*663afb9bSAndroid Build Coastguard Worker extern "C" {
32*663afb9bSAndroid Build Coastguard Worker #endif
33*663afb9bSAndroid Build Coastguard Worker 
34*663afb9bSAndroid Build Coastguard Worker #include "event2/event-config.h"
35*663afb9bSAndroid Build Coastguard Worker #include "evconfig-private.h"
36*663afb9bSAndroid Build Coastguard Worker 
37*663afb9bSAndroid Build Coastguard Worker #include <time.h>
38*663afb9bSAndroid Build Coastguard Worker #include <sys/queue.h>
39*663afb9bSAndroid Build Coastguard Worker #include "event2/event_struct.h"
40*663afb9bSAndroid Build Coastguard Worker #include "minheap-internal.h"
41*663afb9bSAndroid Build Coastguard Worker #include "evsignal-internal.h"
42*663afb9bSAndroid Build Coastguard Worker #include "mm-internal.h"
43*663afb9bSAndroid Build Coastguard Worker #include "defer-internal.h"
44*663afb9bSAndroid Build Coastguard Worker 
45*663afb9bSAndroid Build Coastguard Worker /* map union members back */
46*663afb9bSAndroid Build Coastguard Worker 
47*663afb9bSAndroid Build Coastguard Worker /* mutually exclusive */
48*663afb9bSAndroid Build Coastguard Worker #define ev_signal_next	ev_.ev_signal.ev_signal_next
49*663afb9bSAndroid Build Coastguard Worker #define ev_io_next	ev_.ev_io.ev_io_next
50*663afb9bSAndroid Build Coastguard Worker #define ev_io_timeout	ev_.ev_io.ev_timeout
51*663afb9bSAndroid Build Coastguard Worker 
52*663afb9bSAndroid Build Coastguard Worker /* used only by signals */
53*663afb9bSAndroid Build Coastguard Worker #define ev_ncalls	ev_.ev_signal.ev_ncalls
54*663afb9bSAndroid Build Coastguard Worker #define ev_pncalls	ev_.ev_signal.ev_pncalls
55*663afb9bSAndroid Build Coastguard Worker 
56*663afb9bSAndroid Build Coastguard Worker #define ev_pri ev_evcallback.evcb_pri
57*663afb9bSAndroid Build Coastguard Worker #define ev_flags ev_evcallback.evcb_flags
58*663afb9bSAndroid Build Coastguard Worker #define ev_closure ev_evcallback.evcb_closure
59*663afb9bSAndroid Build Coastguard Worker #define ev_callback ev_evcallback.evcb_cb_union.evcb_callback
60*663afb9bSAndroid Build Coastguard Worker #define ev_arg ev_evcallback.evcb_arg
61*663afb9bSAndroid Build Coastguard Worker 
62*663afb9bSAndroid Build Coastguard Worker /** @name Event closure codes
63*663afb9bSAndroid Build Coastguard Worker 
64*663afb9bSAndroid Build Coastguard Worker     Possible values for evcb_closure in struct event_callback
65*663afb9bSAndroid Build Coastguard Worker 
66*663afb9bSAndroid Build Coastguard Worker     @{
67*663afb9bSAndroid Build Coastguard Worker  */
68*663afb9bSAndroid Build Coastguard Worker /** A regular event. Uses the evcb_callback callback */
69*663afb9bSAndroid Build Coastguard Worker #define EV_CLOSURE_EVENT 0
70*663afb9bSAndroid Build Coastguard Worker /** A signal event. Uses the evcb_callback callback */
71*663afb9bSAndroid Build Coastguard Worker #define EV_CLOSURE_EVENT_SIGNAL 1
72*663afb9bSAndroid Build Coastguard Worker /** A persistent non-signal event. Uses the evcb_callback callback */
73*663afb9bSAndroid Build Coastguard Worker #define EV_CLOSURE_EVENT_PERSIST 2
74*663afb9bSAndroid Build Coastguard Worker /** A simple callback. Uses the evcb_selfcb callback. */
75*663afb9bSAndroid Build Coastguard Worker #define EV_CLOSURE_CB_SELF 3
76*663afb9bSAndroid Build Coastguard Worker /** A finalizing callback. Uses the evcb_cbfinalize callback. */
77*663afb9bSAndroid Build Coastguard Worker #define EV_CLOSURE_CB_FINALIZE 4
78*663afb9bSAndroid Build Coastguard Worker /** A finalizing event. Uses the evcb_evfinalize callback. */
79*663afb9bSAndroid Build Coastguard Worker #define EV_CLOSURE_EVENT_FINALIZE 5
80*663afb9bSAndroid Build Coastguard Worker /** A finalizing event that should get freed after. Uses the evcb_evfinalize
81*663afb9bSAndroid Build Coastguard Worker  * callback. */
82*663afb9bSAndroid Build Coastguard Worker #define EV_CLOSURE_EVENT_FINALIZE_FREE 6
83*663afb9bSAndroid Build Coastguard Worker /** @} */
84*663afb9bSAndroid Build Coastguard Worker 
85*663afb9bSAndroid Build Coastguard Worker /** Structure to define the backend of a given event_base. */
86*663afb9bSAndroid Build Coastguard Worker struct eventop {
87*663afb9bSAndroid Build Coastguard Worker 	/** The name of this backend. */
88*663afb9bSAndroid Build Coastguard Worker 	const char *name;
89*663afb9bSAndroid Build Coastguard Worker 	/** Function to set up an event_base to use this backend.  It should
90*663afb9bSAndroid Build Coastguard Worker 	 * create a new structure holding whatever information is needed to
91*663afb9bSAndroid Build Coastguard Worker 	 * run the backend, and return it.  The returned pointer will get
92*663afb9bSAndroid Build Coastguard Worker 	 * stored by event_init into the event_base.evbase field.  On failure,
93*663afb9bSAndroid Build Coastguard Worker 	 * this function should return NULL. */
94*663afb9bSAndroid Build Coastguard Worker 	void *(*init)(struct event_base *);
95*663afb9bSAndroid Build Coastguard Worker 	/** Enable reading/writing on a given fd or signal.  'events' will be
96*663afb9bSAndroid Build Coastguard Worker 	 * the events that we're trying to enable: one or more of EV_READ,
97*663afb9bSAndroid Build Coastguard Worker 	 * EV_WRITE, EV_SIGNAL, and EV_ET.  'old' will be those events that
98*663afb9bSAndroid Build Coastguard Worker 	 * were enabled on this fd previously.  'fdinfo' will be a structure
99*663afb9bSAndroid Build Coastguard Worker 	 * associated with the fd by the evmap; its size is defined by the
100*663afb9bSAndroid Build Coastguard Worker 	 * fdinfo field below.  It will be set to 0 the first time the fd is
101*663afb9bSAndroid Build Coastguard Worker 	 * added.  The function should return 0 on success and -1 on error.
102*663afb9bSAndroid Build Coastguard Worker 	 */
103*663afb9bSAndroid Build Coastguard Worker 	int (*add)(struct event_base *, evutil_socket_t fd, short old, short events, void *fdinfo);
104*663afb9bSAndroid Build Coastguard Worker 	/** As "add", except 'events' contains the events we mean to disable. */
105*663afb9bSAndroid Build Coastguard Worker 	int (*del)(struct event_base *, evutil_socket_t fd, short old, short events, void *fdinfo);
106*663afb9bSAndroid Build Coastguard Worker 	/** Function to implement the core of an event loop.  It must see which
107*663afb9bSAndroid Build Coastguard Worker 	    added events are ready, and cause event_active to be called for each
108*663afb9bSAndroid Build Coastguard Worker 	    active event (usually via event_io_active or such).  It should
109*663afb9bSAndroid Build Coastguard Worker 	    return 0 on success and -1 on error.
110*663afb9bSAndroid Build Coastguard Worker 	 */
111*663afb9bSAndroid Build Coastguard Worker 	int (*dispatch)(struct event_base *, struct timeval *);
112*663afb9bSAndroid Build Coastguard Worker 	/** Function to clean up and free our data from the event_base. */
113*663afb9bSAndroid Build Coastguard Worker 	void (*dealloc)(struct event_base *);
114*663afb9bSAndroid Build Coastguard Worker 	/** Flag: set if we need to reinitialize the event base after we fork.
115*663afb9bSAndroid Build Coastguard Worker 	 */
116*663afb9bSAndroid Build Coastguard Worker 	int need_reinit;
117*663afb9bSAndroid Build Coastguard Worker 	/** Bit-array of supported event_method_features that this backend can
118*663afb9bSAndroid Build Coastguard Worker 	 * provide. */
119*663afb9bSAndroid Build Coastguard Worker 	enum event_method_feature features;
120*663afb9bSAndroid Build Coastguard Worker 	/** Length of the extra information we should record for each fd that
121*663afb9bSAndroid Build Coastguard Worker 	    has one or more active events.  This information is recorded
122*663afb9bSAndroid Build Coastguard Worker 	    as part of the evmap entry for each fd, and passed as an argument
123*663afb9bSAndroid Build Coastguard Worker 	    to the add and del functions above.
124*663afb9bSAndroid Build Coastguard Worker 	 */
125*663afb9bSAndroid Build Coastguard Worker 	size_t fdinfo_len;
126*663afb9bSAndroid Build Coastguard Worker };
127*663afb9bSAndroid Build Coastguard Worker 
128*663afb9bSAndroid Build Coastguard Worker #ifdef _WIN32
129*663afb9bSAndroid Build Coastguard Worker /* If we're on win32, then file descriptors are not nice low densely packed
130*663afb9bSAndroid Build Coastguard Worker    integers.  Instead, they are pointer-like windows handles, and we want to
131*663afb9bSAndroid Build Coastguard Worker    use a hashtable instead of an array to map fds to events.
132*663afb9bSAndroid Build Coastguard Worker */
133*663afb9bSAndroid Build Coastguard Worker #define EVMAP_USE_HT
134*663afb9bSAndroid Build Coastguard Worker #endif
135*663afb9bSAndroid Build Coastguard Worker 
136*663afb9bSAndroid Build Coastguard Worker /* #define HT_CACHE_HASH_VALS */
137*663afb9bSAndroid Build Coastguard Worker 
138*663afb9bSAndroid Build Coastguard Worker #ifdef EVMAP_USE_HT
139*663afb9bSAndroid Build Coastguard Worker #define HT_NO_CACHE_HASH_VALUES
140*663afb9bSAndroid Build Coastguard Worker #include "ht-internal.h"
141*663afb9bSAndroid Build Coastguard Worker struct event_map_entry;
142*663afb9bSAndroid Build Coastguard Worker HT_HEAD(event_io_map, event_map_entry);
143*663afb9bSAndroid Build Coastguard Worker #else
144*663afb9bSAndroid Build Coastguard Worker #define event_io_map event_signal_map
145*663afb9bSAndroid Build Coastguard Worker #endif
146*663afb9bSAndroid Build Coastguard Worker 
147*663afb9bSAndroid Build Coastguard Worker /* Used to map signal numbers to a list of events.  If EVMAP_USE_HT is not
148*663afb9bSAndroid Build Coastguard Worker    defined, this structure is also used as event_io_map, which maps fds to a
149*663afb9bSAndroid Build Coastguard Worker    list of events.
150*663afb9bSAndroid Build Coastguard Worker */
151*663afb9bSAndroid Build Coastguard Worker struct event_signal_map {
152*663afb9bSAndroid Build Coastguard Worker 	/* An array of evmap_io * or of evmap_signal *; empty entries are
153*663afb9bSAndroid Build Coastguard Worker 	 * set to NULL. */
154*663afb9bSAndroid Build Coastguard Worker 	void **entries;
155*663afb9bSAndroid Build Coastguard Worker 	/* The number of entries available in entries */
156*663afb9bSAndroid Build Coastguard Worker 	int nentries;
157*663afb9bSAndroid Build Coastguard Worker };
158*663afb9bSAndroid Build Coastguard Worker 
159*663afb9bSAndroid Build Coastguard Worker /* A list of events waiting on a given 'common' timeout value.  Ordinarily,
160*663afb9bSAndroid Build Coastguard Worker  * events waiting for a timeout wait on a minheap.  Sometimes, however, a
161*663afb9bSAndroid Build Coastguard Worker  * queue can be faster.
162*663afb9bSAndroid Build Coastguard Worker  **/
163*663afb9bSAndroid Build Coastguard Worker struct common_timeout_list {
164*663afb9bSAndroid Build Coastguard Worker 	/* List of events currently waiting in the queue. */
165*663afb9bSAndroid Build Coastguard Worker 	struct event_list events;
166*663afb9bSAndroid Build Coastguard Worker 	/* 'magic' timeval used to indicate the duration of events in this
167*663afb9bSAndroid Build Coastguard Worker 	 * queue. */
168*663afb9bSAndroid Build Coastguard Worker 	struct timeval duration;
169*663afb9bSAndroid Build Coastguard Worker 	/* Event that triggers whenever one of the events in the queue is
170*663afb9bSAndroid Build Coastguard Worker 	 * ready to activate */
171*663afb9bSAndroid Build Coastguard Worker 	struct event timeout_event;
172*663afb9bSAndroid Build Coastguard Worker 	/* The event_base that this timeout list is part of */
173*663afb9bSAndroid Build Coastguard Worker 	struct event_base *base;
174*663afb9bSAndroid Build Coastguard Worker };
175*663afb9bSAndroid Build Coastguard Worker 
176*663afb9bSAndroid Build Coastguard Worker /** Mask used to get the real tv_usec value from a common timeout. */
177*663afb9bSAndroid Build Coastguard Worker #define COMMON_TIMEOUT_MICROSECONDS_MASK       0x000fffff
178*663afb9bSAndroid Build Coastguard Worker 
179*663afb9bSAndroid Build Coastguard Worker struct event_change;
180*663afb9bSAndroid Build Coastguard Worker 
181*663afb9bSAndroid Build Coastguard Worker /* List of 'changes' since the last call to eventop.dispatch.  Only maintained
182*663afb9bSAndroid Build Coastguard Worker  * if the backend is using changesets. */
183*663afb9bSAndroid Build Coastguard Worker struct event_changelist {
184*663afb9bSAndroid Build Coastguard Worker 	struct event_change *changes;
185*663afb9bSAndroid Build Coastguard Worker 	int n_changes;
186*663afb9bSAndroid Build Coastguard Worker 	int changes_size;
187*663afb9bSAndroid Build Coastguard Worker };
188*663afb9bSAndroid Build Coastguard Worker 
189*663afb9bSAndroid Build Coastguard Worker #ifndef EVENT__DISABLE_DEBUG_MODE
190*663afb9bSAndroid Build Coastguard Worker /* Global internal flag: set to one if debug mode is on. */
191*663afb9bSAndroid Build Coastguard Worker extern int event_debug_mode_on_;
192*663afb9bSAndroid Build Coastguard Worker #define EVENT_DEBUG_MODE_IS_ON() (event_debug_mode_on_)
193*663afb9bSAndroid Build Coastguard Worker #else
194*663afb9bSAndroid Build Coastguard Worker #define EVENT_DEBUG_MODE_IS_ON() (0)
195*663afb9bSAndroid Build Coastguard Worker #endif
196*663afb9bSAndroid Build Coastguard Worker 
197*663afb9bSAndroid Build Coastguard Worker TAILQ_HEAD(evcallback_list, event_callback);
198*663afb9bSAndroid Build Coastguard Worker 
199*663afb9bSAndroid Build Coastguard Worker /* Sets up an event for processing once */
200*663afb9bSAndroid Build Coastguard Worker struct event_once {
201*663afb9bSAndroid Build Coastguard Worker 	LIST_ENTRY(event_once) next_once;
202*663afb9bSAndroid Build Coastguard Worker 	struct event ev;
203*663afb9bSAndroid Build Coastguard Worker 
204*663afb9bSAndroid Build Coastguard Worker 	void (*cb)(evutil_socket_t, short, void *);
205*663afb9bSAndroid Build Coastguard Worker 	void *arg;
206*663afb9bSAndroid Build Coastguard Worker };
207*663afb9bSAndroid Build Coastguard Worker 
208*663afb9bSAndroid Build Coastguard Worker struct event_base {
209*663afb9bSAndroid Build Coastguard Worker 	/** Function pointers and other data to describe this event_base's
210*663afb9bSAndroid Build Coastguard Worker 	 * backend. */
211*663afb9bSAndroid Build Coastguard Worker 	const struct eventop *evsel;
212*663afb9bSAndroid Build Coastguard Worker 	/** Pointer to backend-specific data. */
213*663afb9bSAndroid Build Coastguard Worker 	void *evbase;
214*663afb9bSAndroid Build Coastguard Worker 
215*663afb9bSAndroid Build Coastguard Worker 	/** List of changes to tell backend about at next dispatch.  Only used
216*663afb9bSAndroid Build Coastguard Worker 	 * by the O(1) backends. */
217*663afb9bSAndroid Build Coastguard Worker 	struct event_changelist changelist;
218*663afb9bSAndroid Build Coastguard Worker 
219*663afb9bSAndroid Build Coastguard Worker 	/** Function pointers used to describe the backend that this event_base
220*663afb9bSAndroid Build Coastguard Worker 	 * uses for signals */
221*663afb9bSAndroid Build Coastguard Worker 	const struct eventop *evsigsel;
222*663afb9bSAndroid Build Coastguard Worker 	/** Data to implement the common signal handler code. */
223*663afb9bSAndroid Build Coastguard Worker 	struct evsig_info sig;
224*663afb9bSAndroid Build Coastguard Worker 
225*663afb9bSAndroid Build Coastguard Worker 	/** Number of virtual events */
226*663afb9bSAndroid Build Coastguard Worker 	int virtual_event_count;
227*663afb9bSAndroid Build Coastguard Worker 	/** Maximum number of virtual events active */
228*663afb9bSAndroid Build Coastguard Worker 	int virtual_event_count_max;
229*663afb9bSAndroid Build Coastguard Worker 	/** Number of total events added to this event_base */
230*663afb9bSAndroid Build Coastguard Worker 	int event_count;
231*663afb9bSAndroid Build Coastguard Worker 	/** Maximum number of total events added to this event_base */
232*663afb9bSAndroid Build Coastguard Worker 	int event_count_max;
233*663afb9bSAndroid Build Coastguard Worker 	/** Number of total events active in this event_base */
234*663afb9bSAndroid Build Coastguard Worker 	int event_count_active;
235*663afb9bSAndroid Build Coastguard Worker 	/** Maximum number of total events active in this event_base */
236*663afb9bSAndroid Build Coastguard Worker 	int event_count_active_max;
237*663afb9bSAndroid Build Coastguard Worker 
238*663afb9bSAndroid Build Coastguard Worker 	/** Set if we should terminate the loop once we're done processing
239*663afb9bSAndroid Build Coastguard Worker 	 * events. */
240*663afb9bSAndroid Build Coastguard Worker 	int event_gotterm;
241*663afb9bSAndroid Build Coastguard Worker 	/** Set if we should terminate the loop immediately */
242*663afb9bSAndroid Build Coastguard Worker 	int event_break;
243*663afb9bSAndroid Build Coastguard Worker 	/** Set if we should start a new instance of the loop immediately. */
244*663afb9bSAndroid Build Coastguard Worker 	int event_continue;
245*663afb9bSAndroid Build Coastguard Worker 
246*663afb9bSAndroid Build Coastguard Worker 	/** The currently running priority of events */
247*663afb9bSAndroid Build Coastguard Worker 	int event_running_priority;
248*663afb9bSAndroid Build Coastguard Worker 
249*663afb9bSAndroid Build Coastguard Worker 	/** Set if we're running the event_base_loop function, to prevent
250*663afb9bSAndroid Build Coastguard Worker 	 * reentrant invocation. */
251*663afb9bSAndroid Build Coastguard Worker 	int running_loop;
252*663afb9bSAndroid Build Coastguard Worker 
253*663afb9bSAndroid Build Coastguard Worker 	/** Set to the number of deferred_cbs we've made 'active' in the
254*663afb9bSAndroid Build Coastguard Worker 	 * loop.  This is a hack to prevent starvation; it would be smarter
255*663afb9bSAndroid Build Coastguard Worker 	 * to just use event_config_set_max_dispatch_interval's max_callbacks
256*663afb9bSAndroid Build Coastguard Worker 	 * feature */
257*663afb9bSAndroid Build Coastguard Worker 	int n_deferreds_queued;
258*663afb9bSAndroid Build Coastguard Worker 
259*663afb9bSAndroid Build Coastguard Worker 	/* Active event management. */
260*663afb9bSAndroid Build Coastguard Worker 	/** An array of nactivequeues queues for active event_callbacks (ones
261*663afb9bSAndroid Build Coastguard Worker 	 * that have triggered, and whose callbacks need to be called).  Low
262*663afb9bSAndroid Build Coastguard Worker 	 * priority numbers are more important, and stall higher ones.
263*663afb9bSAndroid Build Coastguard Worker 	 */
264*663afb9bSAndroid Build Coastguard Worker 	struct evcallback_list *activequeues;
265*663afb9bSAndroid Build Coastguard Worker 	/** The length of the activequeues array */
266*663afb9bSAndroid Build Coastguard Worker 	int nactivequeues;
267*663afb9bSAndroid Build Coastguard Worker 	/** A list of event_callbacks that should become active the next time
268*663afb9bSAndroid Build Coastguard Worker 	 * we process events, but not this time. */
269*663afb9bSAndroid Build Coastguard Worker 	struct evcallback_list active_later_queue;
270*663afb9bSAndroid Build Coastguard Worker 
271*663afb9bSAndroid Build Coastguard Worker 	/* common timeout logic */
272*663afb9bSAndroid Build Coastguard Worker 
273*663afb9bSAndroid Build Coastguard Worker 	/** An array of common_timeout_list* for all of the common timeout
274*663afb9bSAndroid Build Coastguard Worker 	 * values we know. */
275*663afb9bSAndroid Build Coastguard Worker 	struct common_timeout_list **common_timeout_queues;
276*663afb9bSAndroid Build Coastguard Worker 	/** The number of entries used in common_timeout_queues */
277*663afb9bSAndroid Build Coastguard Worker 	int n_common_timeouts;
278*663afb9bSAndroid Build Coastguard Worker 	/** The total size of common_timeout_queues. */
279*663afb9bSAndroid Build Coastguard Worker 	int n_common_timeouts_allocated;
280*663afb9bSAndroid Build Coastguard Worker 
281*663afb9bSAndroid Build Coastguard Worker 	/** Mapping from file descriptors to enabled (added) events */
282*663afb9bSAndroid Build Coastguard Worker 	struct event_io_map io;
283*663afb9bSAndroid Build Coastguard Worker 
284*663afb9bSAndroid Build Coastguard Worker 	/** Mapping from signal numbers to enabled (added) events. */
285*663afb9bSAndroid Build Coastguard Worker 	struct event_signal_map sigmap;
286*663afb9bSAndroid Build Coastguard Worker 
287*663afb9bSAndroid Build Coastguard Worker 	/** Priority queue of events with timeouts. */
288*663afb9bSAndroid Build Coastguard Worker 	struct min_heap timeheap;
289*663afb9bSAndroid Build Coastguard Worker 
290*663afb9bSAndroid Build Coastguard Worker 	/** Stored timeval: used to avoid calling gettimeofday/clock_gettime
291*663afb9bSAndroid Build Coastguard Worker 	 * too often. */
292*663afb9bSAndroid Build Coastguard Worker 	struct timeval tv_cache;
293*663afb9bSAndroid Build Coastguard Worker 
294*663afb9bSAndroid Build Coastguard Worker 	struct evutil_monotonic_timer monotonic_timer;
295*663afb9bSAndroid Build Coastguard Worker 
296*663afb9bSAndroid Build Coastguard Worker 	/** Difference between internal time (maybe from clock_gettime) and
297*663afb9bSAndroid Build Coastguard Worker 	 * gettimeofday. */
298*663afb9bSAndroid Build Coastguard Worker 	struct timeval tv_clock_diff;
299*663afb9bSAndroid Build Coastguard Worker 	/** Second in which we last updated tv_clock_diff, in monotonic time. */
300*663afb9bSAndroid Build Coastguard Worker 	time_t last_updated_clock_diff;
301*663afb9bSAndroid Build Coastguard Worker 
302*663afb9bSAndroid Build Coastguard Worker #ifndef EVENT__DISABLE_THREAD_SUPPORT
303*663afb9bSAndroid Build Coastguard Worker 	/* threading support */
304*663afb9bSAndroid Build Coastguard Worker 	/** The thread currently running the event_loop for this base */
305*663afb9bSAndroid Build Coastguard Worker 	unsigned long th_owner_id;
306*663afb9bSAndroid Build Coastguard Worker 	/** A lock to prevent conflicting accesses to this event_base */
307*663afb9bSAndroid Build Coastguard Worker 	void *th_base_lock;
308*663afb9bSAndroid Build Coastguard Worker 	/** A condition that gets signalled when we're done processing an
309*663afb9bSAndroid Build Coastguard Worker 	 * event with waiters on it. */
310*663afb9bSAndroid Build Coastguard Worker 	void *current_event_cond;
311*663afb9bSAndroid Build Coastguard Worker 	/** Number of threads blocking on current_event_cond. */
312*663afb9bSAndroid Build Coastguard Worker 	int current_event_waiters;
313*663afb9bSAndroid Build Coastguard Worker #endif
314*663afb9bSAndroid Build Coastguard Worker 	/** The event whose callback is executing right now */
315*663afb9bSAndroid Build Coastguard Worker 	struct event_callback *current_event;
316*663afb9bSAndroid Build Coastguard Worker 
317*663afb9bSAndroid Build Coastguard Worker #ifdef _WIN32
318*663afb9bSAndroid Build Coastguard Worker 	/** IOCP support structure, if IOCP is enabled. */
319*663afb9bSAndroid Build Coastguard Worker 	struct event_iocp_port *iocp;
320*663afb9bSAndroid Build Coastguard Worker #endif
321*663afb9bSAndroid Build Coastguard Worker 
322*663afb9bSAndroid Build Coastguard Worker 	/** Flags that this base was configured with */
323*663afb9bSAndroid Build Coastguard Worker 	enum event_base_config_flag flags;
324*663afb9bSAndroid Build Coastguard Worker 
325*663afb9bSAndroid Build Coastguard Worker 	struct timeval max_dispatch_time;
326*663afb9bSAndroid Build Coastguard Worker 	int max_dispatch_callbacks;
327*663afb9bSAndroid Build Coastguard Worker 	int limit_callbacks_after_prio;
328*663afb9bSAndroid Build Coastguard Worker 
329*663afb9bSAndroid Build Coastguard Worker 	/* Notify main thread to wake up break, etc. */
330*663afb9bSAndroid Build Coastguard Worker 	/** True if the base already has a pending notify, and we don't need
331*663afb9bSAndroid Build Coastguard Worker 	 * to add any more. */
332*663afb9bSAndroid Build Coastguard Worker 	int is_notify_pending;
333*663afb9bSAndroid Build Coastguard Worker 	/** A socketpair used by some th_notify functions to wake up the main
334*663afb9bSAndroid Build Coastguard Worker 	 * thread. */
335*663afb9bSAndroid Build Coastguard Worker 	evutil_socket_t th_notify_fd[2];
336*663afb9bSAndroid Build Coastguard Worker 	/** An event used by some th_notify functions to wake up the main
337*663afb9bSAndroid Build Coastguard Worker 	 * thread. */
338*663afb9bSAndroid Build Coastguard Worker 	struct event th_notify;
339*663afb9bSAndroid Build Coastguard Worker 	/** A function used to wake up the main thread from another thread. */
340*663afb9bSAndroid Build Coastguard Worker 	int (*th_notify_fn)(struct event_base *base);
341*663afb9bSAndroid Build Coastguard Worker 
342*663afb9bSAndroid Build Coastguard Worker 	/** Saved seed for weak random number generator. Some backends use
343*663afb9bSAndroid Build Coastguard Worker 	 * this to produce fairness among sockets. Protected by th_base_lock. */
344*663afb9bSAndroid Build Coastguard Worker 	struct evutil_weakrand_state weakrand_seed;
345*663afb9bSAndroid Build Coastguard Worker 
346*663afb9bSAndroid Build Coastguard Worker 	/** List of event_onces that have not yet fired. */
347*663afb9bSAndroid Build Coastguard Worker 	LIST_HEAD(once_event_list, event_once) once_events;
348*663afb9bSAndroid Build Coastguard Worker 
349*663afb9bSAndroid Build Coastguard Worker };
350*663afb9bSAndroid Build Coastguard Worker 
351*663afb9bSAndroid Build Coastguard Worker struct event_config_entry {
352*663afb9bSAndroid Build Coastguard Worker 	TAILQ_ENTRY(event_config_entry) next;
353*663afb9bSAndroid Build Coastguard Worker 
354*663afb9bSAndroid Build Coastguard Worker 	const char *avoid_method;
355*663afb9bSAndroid Build Coastguard Worker };
356*663afb9bSAndroid Build Coastguard Worker 
357*663afb9bSAndroid Build Coastguard Worker /** Internal structure: describes the configuration we want for an event_base
358*663afb9bSAndroid Build Coastguard Worker  * that we're about to allocate. */
359*663afb9bSAndroid Build Coastguard Worker struct event_config {
360*663afb9bSAndroid Build Coastguard Worker 	TAILQ_HEAD(event_configq, event_config_entry) entries;
361*663afb9bSAndroid Build Coastguard Worker 
362*663afb9bSAndroid Build Coastguard Worker 	int n_cpus_hint;
363*663afb9bSAndroid Build Coastguard Worker 	struct timeval max_dispatch_interval;
364*663afb9bSAndroid Build Coastguard Worker 	int max_dispatch_callbacks;
365*663afb9bSAndroid Build Coastguard Worker 	int limit_callbacks_after_prio;
366*663afb9bSAndroid Build Coastguard Worker 	enum event_method_feature require_features;
367*663afb9bSAndroid Build Coastguard Worker 	enum event_base_config_flag flags;
368*663afb9bSAndroid Build Coastguard Worker };
369*663afb9bSAndroid Build Coastguard Worker 
370*663afb9bSAndroid Build Coastguard Worker /* Internal use only: Functions that might be missing from <sys/queue.h> */
371*663afb9bSAndroid Build Coastguard Worker #ifndef LIST_END
372*663afb9bSAndroid Build Coastguard Worker #define LIST_END(head)			NULL
373*663afb9bSAndroid Build Coastguard Worker #endif
374*663afb9bSAndroid Build Coastguard Worker 
375*663afb9bSAndroid Build Coastguard Worker #ifndef TAILQ_FIRST
376*663afb9bSAndroid Build Coastguard Worker #define	TAILQ_FIRST(head)		((head)->tqh_first)
377*663afb9bSAndroid Build Coastguard Worker #endif
378*663afb9bSAndroid Build Coastguard Worker #ifndef TAILQ_END
379*663afb9bSAndroid Build Coastguard Worker #define	TAILQ_END(head)			NULL
380*663afb9bSAndroid Build Coastguard Worker #endif
381*663afb9bSAndroid Build Coastguard Worker #ifndef TAILQ_NEXT
382*663afb9bSAndroid Build Coastguard Worker #define	TAILQ_NEXT(elm, field)		((elm)->field.tqe_next)
383*663afb9bSAndroid Build Coastguard Worker #endif
384*663afb9bSAndroid Build Coastguard Worker 
385*663afb9bSAndroid Build Coastguard Worker #ifndef TAILQ_FOREACH
386*663afb9bSAndroid Build Coastguard Worker #define TAILQ_FOREACH(var, head, field)					\
387*663afb9bSAndroid Build Coastguard Worker 	for ((var) = TAILQ_FIRST(head);					\
388*663afb9bSAndroid Build Coastguard Worker 	     (var) != TAILQ_END(head);					\
389*663afb9bSAndroid Build Coastguard Worker 	     (var) = TAILQ_NEXT(var, field))
390*663afb9bSAndroid Build Coastguard Worker #endif
391*663afb9bSAndroid Build Coastguard Worker 
392*663afb9bSAndroid Build Coastguard Worker #ifndef TAILQ_INSERT_BEFORE
393*663afb9bSAndroid Build Coastguard Worker #define	TAILQ_INSERT_BEFORE(listelm, elm, field) do {			\
394*663afb9bSAndroid Build Coastguard Worker 	(elm)->field.tqe_prev = (listelm)->field.tqe_prev;		\
395*663afb9bSAndroid Build Coastguard Worker 	(elm)->field.tqe_next = (listelm);				\
396*663afb9bSAndroid Build Coastguard Worker 	*(listelm)->field.tqe_prev = (elm);				\
397*663afb9bSAndroid Build Coastguard Worker 	(listelm)->field.tqe_prev = &(elm)->field.tqe_next;		\
398*663afb9bSAndroid Build Coastguard Worker } while (0)
399*663afb9bSAndroid Build Coastguard Worker #endif
400*663afb9bSAndroid Build Coastguard Worker 
401*663afb9bSAndroid Build Coastguard Worker #define N_ACTIVE_CALLBACKS(base)					\
402*663afb9bSAndroid Build Coastguard Worker 	((base)->event_count_active)
403*663afb9bSAndroid Build Coastguard Worker 
404*663afb9bSAndroid Build Coastguard Worker int evsig_set_handler_(struct event_base *base, int evsignal,
405*663afb9bSAndroid Build Coastguard Worker 			  void (*fn)(int));
406*663afb9bSAndroid Build Coastguard Worker int evsig_restore_handler_(struct event_base *base, int evsignal);
407*663afb9bSAndroid Build Coastguard Worker 
408*663afb9bSAndroid Build Coastguard Worker int event_add_nolock_(struct event *ev,
409*663afb9bSAndroid Build Coastguard Worker     const struct timeval *tv, int tv_is_absolute);
410*663afb9bSAndroid Build Coastguard Worker /** Argument for event_del_nolock_. Tells event_del not to block on the event
411*663afb9bSAndroid Build Coastguard Worker  * if it's running in another thread. */
412*663afb9bSAndroid Build Coastguard Worker #define EVENT_DEL_NOBLOCK 0
413*663afb9bSAndroid Build Coastguard Worker /** Argument for event_del_nolock_. Tells event_del to block on the event
414*663afb9bSAndroid Build Coastguard Worker  * if it's running in another thread, regardless of its value for EV_FINALIZE
415*663afb9bSAndroid Build Coastguard Worker  */
416*663afb9bSAndroid Build Coastguard Worker #define EVENT_DEL_BLOCK 1
417*663afb9bSAndroid Build Coastguard Worker /** Argument for event_del_nolock_. Tells event_del to block on the event
418*663afb9bSAndroid Build Coastguard Worker  * if it is running in another thread and it doesn't have EV_FINALIZE set.
419*663afb9bSAndroid Build Coastguard Worker  */
420*663afb9bSAndroid Build Coastguard Worker #define EVENT_DEL_AUTOBLOCK 2
421*663afb9bSAndroid Build Coastguard Worker /** Argument for event_del_nolock_. Tells event_del to proceed even if the
422*663afb9bSAndroid Build Coastguard Worker  * event is set up for finalization rather for regular use.*/
423*663afb9bSAndroid Build Coastguard Worker #define EVENT_DEL_EVEN_IF_FINALIZING 3
424*663afb9bSAndroid Build Coastguard Worker int event_del_nolock_(struct event *ev, int blocking);
425*663afb9bSAndroid Build Coastguard Worker int event_remove_timer_nolock_(struct event *ev);
426*663afb9bSAndroid Build Coastguard Worker 
427*663afb9bSAndroid Build Coastguard Worker void event_active_nolock_(struct event *ev, int res, short count);
428*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
429*663afb9bSAndroid Build Coastguard Worker int event_callback_activate_(struct event_base *, struct event_callback *);
430*663afb9bSAndroid Build Coastguard Worker int event_callback_activate_nolock_(struct event_base *, struct event_callback *);
431*663afb9bSAndroid Build Coastguard Worker int event_callback_cancel_(struct event_base *base,
432*663afb9bSAndroid Build Coastguard Worker     struct event_callback *evcb);
433*663afb9bSAndroid Build Coastguard Worker 
434*663afb9bSAndroid Build Coastguard Worker void event_callback_finalize_nolock_(struct event_base *base, unsigned flags, struct event_callback *evcb, void (*cb)(struct event_callback *, void *));
435*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
436*663afb9bSAndroid Build Coastguard Worker void event_callback_finalize_(struct event_base *base, unsigned flags, struct event_callback *evcb, void (*cb)(struct event_callback *, void *));
437*663afb9bSAndroid Build Coastguard Worker int event_callback_finalize_many_(struct event_base *base, int n_cbs, struct event_callback **evcb, void (*cb)(struct event_callback *, void *));
438*663afb9bSAndroid Build Coastguard Worker 
439*663afb9bSAndroid Build Coastguard Worker 
440*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
441*663afb9bSAndroid Build Coastguard Worker void event_active_later_(struct event *ev, int res);
442*663afb9bSAndroid Build Coastguard Worker void event_active_later_nolock_(struct event *ev, int res);
443*663afb9bSAndroid Build Coastguard Worker int event_callback_activate_later_nolock_(struct event_base *base,
444*663afb9bSAndroid Build Coastguard Worker     struct event_callback *evcb);
445*663afb9bSAndroid Build Coastguard Worker int event_callback_cancel_nolock_(struct event_base *base,
446*663afb9bSAndroid Build Coastguard Worker     struct event_callback *evcb, int even_if_finalizing);
447*663afb9bSAndroid Build Coastguard Worker void event_callback_init_(struct event_base *base,
448*663afb9bSAndroid Build Coastguard Worker     struct event_callback *cb);
449*663afb9bSAndroid Build Coastguard Worker 
450*663afb9bSAndroid Build Coastguard Worker /* FIXME document. */
451*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
452*663afb9bSAndroid Build Coastguard Worker void event_base_add_virtual_(struct event_base *base);
453*663afb9bSAndroid Build Coastguard Worker void event_base_del_virtual_(struct event_base *base);
454*663afb9bSAndroid Build Coastguard Worker 
455*663afb9bSAndroid Build Coastguard Worker /** For debugging: unless assertions are disabled, verify the referential
456*663afb9bSAndroid Build Coastguard Worker     integrity of the internal data structures of 'base'.  This operation can
457*663afb9bSAndroid Build Coastguard Worker     be expensive.
458*663afb9bSAndroid Build Coastguard Worker 
459*663afb9bSAndroid Build Coastguard Worker     Returns on success; aborts on failure.
460*663afb9bSAndroid Build Coastguard Worker */
461*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
462*663afb9bSAndroid Build Coastguard Worker void event_base_assert_ok_(struct event_base *base);
463*663afb9bSAndroid Build Coastguard Worker void event_base_assert_ok_nolock_(struct event_base *base);
464*663afb9bSAndroid Build Coastguard Worker 
465*663afb9bSAndroid Build Coastguard Worker 
466*663afb9bSAndroid Build Coastguard Worker /* Helper function: Call 'fn' exactly once every inserted or active event in
467*663afb9bSAndroid Build Coastguard Worker  * the event_base 'base'.
468*663afb9bSAndroid Build Coastguard Worker  *
469*663afb9bSAndroid Build Coastguard Worker  * If fn returns 0, continue on to the next event. Otherwise, return the same
470*663afb9bSAndroid Build Coastguard Worker  * value that fn returned.
471*663afb9bSAndroid Build Coastguard Worker  *
472*663afb9bSAndroid Build Coastguard Worker  * Requires that 'base' be locked.
473*663afb9bSAndroid Build Coastguard Worker  */
474*663afb9bSAndroid Build Coastguard Worker int event_base_foreach_event_nolock_(struct event_base *base,
475*663afb9bSAndroid Build Coastguard Worker     event_base_foreach_event_cb cb, void *arg);
476*663afb9bSAndroid Build Coastguard Worker 
477*663afb9bSAndroid Build Coastguard Worker /* Cleanup function to reset debug mode during shutdown.
478*663afb9bSAndroid Build Coastguard Worker  *
479*663afb9bSAndroid Build Coastguard Worker  * Calling this function doesn't mean it'll be possible to re-enable
480*663afb9bSAndroid Build Coastguard Worker  * debug mode if any events were added.
481*663afb9bSAndroid Build Coastguard Worker  */
482*663afb9bSAndroid Build Coastguard Worker void event_disable_debug_mode(void);
483*663afb9bSAndroid Build Coastguard Worker 
484*663afb9bSAndroid Build Coastguard Worker #ifdef __cplusplus
485*663afb9bSAndroid Build Coastguard Worker }
486*663afb9bSAndroid Build Coastguard Worker #endif
487*663afb9bSAndroid Build Coastguard Worker 
488*663afb9bSAndroid Build Coastguard Worker #endif /* EVENT_INTERNAL_H_INCLUDED_ */
489