xref: /netbsd-src/external/bsd/libevent/dist/event.c (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
1 /*	$NetBSD: event.c,v 1.4 2017/01/31 23:17:39 christos Exp $	*/
2 /*
3  * Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
4  * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. The name of the author may not be used to endorse or promote products
15  *    derived from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 #include "event2/event-config.h"
29 #include <sys/cdefs.h>
30 __RCSID("$NetBSD: event.c,v 1.4 2017/01/31 23:17:39 christos Exp $");
31 #include "evconfig-private.h"
32 
33 #ifdef _WIN32
34 #include <winsock2.h>
35 #define WIN32_LEAN_AND_MEAN
36 #include <windows.h>
37 #undef WIN32_LEAN_AND_MEAN
38 #endif
39 #include <sys/types.h>
40 #if !defined(_WIN32) && defined(EVENT__HAVE_SYS_TIME_H)
41 #include <sys/time.h>
42 #endif
43 #include <sys/queue.h>
44 #ifdef EVENT__HAVE_SYS_SOCKET_H
45 #include <sys/socket.h>
46 #endif
47 #include <stdio.h>
48 #include <stdlib.h>
49 #ifdef EVENT__HAVE_UNISTD_H
50 #include <unistd.h>
51 #endif
52 #include <ctype.h>
53 #include <errno.h>
54 #include <signal.h>
55 #include <string.h>
56 #include <time.h>
57 #include <limits.h>
58 
59 #include "event2/event.h"
60 #include "event2/event_struct.h"
61 #include "event2/event_compat.h"
62 #include "event-internal.h"
63 #include "defer-internal.h"
64 #include "evthread-internal.h"
65 #include "event2/thread.h"
66 #include "event2/util.h"
67 #include "log-internal.h"
68 #include "evmap-internal.h"
69 #include "iocp-internal.h"
70 #include "changelist-internal.h"
71 #define HT_NO_CACHE_HASH_VALUES
72 #include "ht-internal.h"
73 #include "util-internal.h"
74 
75 
76 #ifdef EVENT__HAVE_WORKING_KQUEUE
77 #include "kqueue-internal.h"
78 #endif
79 
80 #ifdef EVENT__HAVE_EVENT_PORTS
81 extern const struct eventop evportops;
82 #endif
83 #ifdef EVENT__HAVE_SELECT
84 extern const struct eventop selectops;
85 #endif
86 #ifdef EVENT__HAVE_POLL
87 extern const struct eventop pollops;
88 #endif
89 #ifdef EVENT__HAVE_EPOLL
90 extern const struct eventop epollops;
91 #endif
92 #ifdef EVENT__HAVE_WORKING_KQUEUE
93 extern const struct eventop kqops;
94 #endif
95 #ifdef EVENT__HAVE_DEVPOLL
96 extern const struct eventop devpollops;
97 #endif
98 #ifdef _WIN32
99 extern const struct eventop win32ops;
100 #endif
101 
102 /* Array of backends in order of preference. */
103 static const struct eventop *eventops[] = {
104 #ifdef EVENT__HAVE_EVENT_PORTS
105 	&evportops,
106 #endif
107 #ifdef EVENT__HAVE_WORKING_KQUEUE
108 	&kqops,
109 #endif
110 #ifdef EVENT__HAVE_EPOLL
111 	&epollops,
112 #endif
113 #ifdef EVENT__HAVE_DEVPOLL
114 	&devpollops,
115 #endif
116 #ifdef EVENT__HAVE_POLL
117 	&pollops,
118 #endif
119 #ifdef EVENT__HAVE_SELECT
120 	&selectops,
121 #endif
122 #ifdef _WIN32
123 	&win32ops,
124 #endif
125 	NULL
126 };
127 
128 /* Global state; deprecated */
129 struct event_base *event_global_current_base_ = NULL;
130 #define current_base event_global_current_base_
131 
132 /* Global state */
133 
134 static void *event_self_cbarg_ptr_ = NULL;
135 
136 /* Prototypes */
137 static void	event_queue_insert_active(struct event_base *, struct event_callback *);
138 static void	event_queue_insert_active_later(struct event_base *, struct event_callback *);
139 static void	event_queue_insert_timeout(struct event_base *, struct event *);
140 static void	event_queue_insert_inserted(struct event_base *, struct event *);
141 static void	event_queue_remove_active(struct event_base *, struct event_callback *);
142 static void	event_queue_remove_active_later(struct event_base *, struct event_callback *);
143 static void	event_queue_remove_timeout(struct event_base *, struct event *);
144 static void	event_queue_remove_inserted(struct event_base *, struct event *);
145 static void event_queue_make_later_events_active(struct event_base *base);
146 
147 static int evthread_make_base_notifiable_nolock_(struct event_base *base);
148 static int event_del_(struct event *ev, int blocking);
149 
150 #ifdef USE_REINSERT_TIMEOUT
151 /* This code seems buggy; only turn it on if we find out what the trouble is. */
152 static void	event_queue_reinsert_timeout(struct event_base *,struct event *, int was_common, int is_common, int old_timeout_idx);
153 #endif
154 
155 static int	event_haveevents(struct event_base *);
156 
157 static int	event_process_active(struct event_base *);
158 
159 static int	timeout_next(struct event_base *, struct timeval **);
160 static void	timeout_process(struct event_base *);
161 
162 static inline void	event_signal_closure(struct event_base *, struct event *ev);
163 static inline void	event_persist_closure(struct event_base *, struct event *ev);
164 
165 static int	evthread_notify_base(struct event_base *base);
166 
167 static void insert_common_timeout_inorder(struct common_timeout_list *ctl,
168     struct event *ev);
169 
170 #ifndef EVENT__DISABLE_DEBUG_MODE
171 /* These functions implement a hashtable of which 'struct event *' structures
172  * have been setup or added.  We don't want to trust the content of the struct
173  * event itself, since we're trying to work through cases where an event gets
174  * clobbered or freed.  Instead, we keep a hashtable indexed by the pointer.
175  */
176 
177 struct event_debug_entry {
178 	HT_ENTRY(event_debug_entry) node;
179 	const struct event *ptr;
180 	unsigned added : 1;
181 };
182 
183 static inline unsigned
184 hash_debug_entry(const struct event_debug_entry *e)
185 {
186 	/* We need to do this silliness to convince compilers that we
187 	 * honestly mean to cast e->ptr to an integer, and discard any
188 	 * part of it that doesn't fit in an unsigned.
189 	 */
190 	unsigned u = (unsigned) ((ev_uintptr_t) e->ptr);
191 	/* Our hashtable implementation is pretty sensitive to low bits,
192 	 * and every struct event is over 64 bytes in size, so we can
193 	 * just say >>6. */
194 	return (u >> 6);
195 }
196 
197 static inline int
198 eq_debug_entry(const struct event_debug_entry *a,
199     const struct event_debug_entry *b)
200 {
201 	return a->ptr == b->ptr;
202 }
203 
204 int event_debug_mode_on_ = 0;
205 
206 
207 #if !defined(EVENT__DISABLE_THREAD_SUPPORT) && !defined(EVENT__DISABLE_DEBUG_MODE)
208 /**
209  * @brief debug mode variable which is set for any function/structure that needs
210  *        to be shared across threads (if thread support is enabled).
211  *
212  *        When and if evthreads are initialized, this variable will be evaluated,
213  *        and if set to something other than zero, this means the evthread setup
214  *        functions were called out of order.
215  *
216  *        See: "Locks and threading" in the documentation.
217  */
218 int event_debug_created_threadable_ctx_ = 0;
219 #endif
220 
221 /* Set if it's too late to enable event_debug_mode. */
222 static int event_debug_mode_too_late = 0;
223 #ifndef EVENT__DISABLE_THREAD_SUPPORT
224 static void *event_debug_map_lock_ = NULL;
225 #endif
226 static HT_HEAD(event_debug_map, event_debug_entry) global_debug_map =
227 	HT_INITIALIZER();
228 
229 HT_PROTOTYPE(event_debug_map, event_debug_entry, node, hash_debug_entry,
230     eq_debug_entry)
231 HT_GENERATE(event_debug_map, event_debug_entry, node, hash_debug_entry,
232     eq_debug_entry, 0.5, mm_malloc, mm_realloc, mm_free)
233 
234 /* Macro: record that ev is now setup (that is, ready for an add) */
235 #define event_debug_note_setup_(ev) do {				\
236 	if (event_debug_mode_on_) {					\
237 		struct event_debug_entry *dent,find;			\
238 		find.ptr = (ev);					\
239 		EVLOCK_LOCK(event_debug_map_lock_, 0);			\
240 		dent = HT_FIND(event_debug_map, &global_debug_map, &find); \
241 		if (dent) {						\
242 			dent->added = 0;				\
243 		} else {						\
244 			dent = mm_malloc(sizeof(*dent));		\
245 			if (!dent)					\
246 				event_err(1,				\
247 				    "Out of memory in debugging code");	\
248 			dent->ptr = (ev);				\
249 			dent->added = 0;				\
250 			HT_INSERT(event_debug_map, &global_debug_map, dent); \
251 		}							\
252 		EVLOCK_UNLOCK(event_debug_map_lock_, 0);		\
253 	}								\
254 	event_debug_mode_too_late = 1;					\
255 	} while (/*CONSTCOND*/0)
256 /* Macro: record that ev is no longer setup */
257 #define event_debug_note_teardown_(ev) do {				\
258 	if (event_debug_mode_on_) {					\
259 		struct event_debug_entry *dent,find;			\
260 		find.ptr = (ev);					\
261 		EVLOCK_LOCK(event_debug_map_lock_, 0);			\
262 		dent = HT_REMOVE(event_debug_map, &global_debug_map, &find); \
263 		if (dent)						\
264 			mm_free(dent);					\
265 		EVLOCK_UNLOCK(event_debug_map_lock_, 0);		\
266 	}								\
267 	event_debug_mode_too_late = 1;					\
268 	} while (/*CONSTCOND*/0)
269 /* Macro: record that ev is now added */
270 #define event_debug_note_add_(ev)	do {				\
271 	if (event_debug_mode_on_) {					\
272 		struct event_debug_entry *dent,find;			\
273 		find.ptr = (ev);					\
274 		EVLOCK_LOCK(event_debug_map_lock_, 0);			\
275 		dent = HT_FIND(event_debug_map, &global_debug_map, &find); \
276 		if (dent) {						\
277 			dent->added = 1;				\
278 		} else {						\
279 			event_errx(EVENT_ERR_ABORT_,			\
280 			    "%s: noting an add on a non-setup event %p" \
281 			    " (events: 0x%x, fd: "EV_SOCK_FMT		\
282 			    ", flags: 0x%x)",				\
283 			    __func__, (ev), (ev)->ev_events,		\
284 			    EV_SOCK_ARG((ev)->ev_fd), (ev)->ev_flags);	\
285 		}							\
286 		EVLOCK_UNLOCK(event_debug_map_lock_, 0);		\
287 	}								\
288 	event_debug_mode_too_late = 1;					\
289 	} while (/*CONSTCOND*/0)
290 /* Macro: record that ev is no longer added */
291 #define event_debug_note_del_(ev) do {					\
292 	if (event_debug_mode_on_) {					\
293 		struct event_debug_entry *dent,find;			\
294 		find.ptr = (ev);					\
295 		EVLOCK_LOCK(event_debug_map_lock_, 0);			\
296 		dent = HT_FIND(event_debug_map, &global_debug_map, &find); \
297 		if (dent) {						\
298 			dent->added = 0;				\
299 		} else {						\
300 			event_errx(EVENT_ERR_ABORT_,			\
301 			    "%s: noting a del on a non-setup event %p"	\
302 			    " (events: 0x%x, fd: "EV_SOCK_FMT		\
303 			    ", flags: 0x%x)",				\
304 			    __func__, (ev), (ev)->ev_events,		\
305 			    EV_SOCK_ARG((ev)->ev_fd), (ev)->ev_flags);	\
306 		}							\
307 		EVLOCK_UNLOCK(event_debug_map_lock_, 0);		\
308 	}								\
309 	event_debug_mode_too_late = 1;					\
310 	} while (/*CONSTCOND*/0)
311 /* Macro: assert that ev is setup (i.e., okay to add or inspect) */
312 #define event_debug_assert_is_setup_(ev) do {				\
313 	if (event_debug_mode_on_) {					\
314 		struct event_debug_entry *dent,find;			\
315 		find.ptr = (ev);					\
316 		EVLOCK_LOCK(event_debug_map_lock_, 0);			\
317 		dent = HT_FIND(event_debug_map, &global_debug_map, &find); \
318 		if (!dent) {						\
319 			event_errx(EVENT_ERR_ABORT_,			\
320 			    "%s called on a non-initialized event %p"	\
321 			    " (events: 0x%x, fd: "EV_SOCK_FMT\
322 			    ", flags: 0x%x)",				\
323 			    __func__, (ev), (ev)->ev_events,		\
324 			    EV_SOCK_ARG((ev)->ev_fd), (ev)->ev_flags);	\
325 		}							\
326 		EVLOCK_UNLOCK(event_debug_map_lock_, 0);		\
327 	}								\
328 	} while (/*CONSTCOND*/0)
329 /* Macro: assert that ev is not added (i.e., okay to tear down or set
330  * up again) */
331 #define event_debug_assert_not_added_(ev) do {				\
332 	if (event_debug_mode_on_) {					\
333 		struct event_debug_entry *dent,find;			\
334 		find.ptr = (ev);					\
335 		EVLOCK_LOCK(event_debug_map_lock_, 0);			\
336 		dent = HT_FIND(event_debug_map, &global_debug_map, &find); \
337 		if (dent && dent->added) {				\
338 			event_errx(EVENT_ERR_ABORT_,			\
339 			    "%s called on an already added event %p"	\
340 			    " (events: 0x%x, fd: "EV_SOCK_FMT", "	\
341 			    "flags: 0x%x)",				\
342 			    __func__, (ev), (ev)->ev_events,		\
343 			    EV_SOCK_ARG((ev)->ev_fd), (ev)->ev_flags);	\
344 		}							\
345 		EVLOCK_UNLOCK(event_debug_map_lock_, 0);		\
346 	}								\
347 	} while (/*CONSTCOND*/0)
348 #else
349 #define event_debug_note_setup_(ev) \
350 	((void)0)
351 #define event_debug_note_teardown_(ev) \
352 	((void)0)
353 #define event_debug_note_add_(ev) \
354 	((void)0)
355 #define event_debug_note_del_(ev) \
356 	((void)0)
357 #define event_debug_assert_is_setup_(ev) \
358 	((void)0)
359 #define event_debug_assert_not_added_(ev) \
360 	((void)0)
361 #endif
362 
363 #define EVENT_BASE_ASSERT_LOCKED(base)		\
364 	EVLOCK_ASSERT_LOCKED((base)->th_base_lock)
365 
366 /* How often (in seconds) do we check for changes in wall clock time relative
367  * to monotonic time?  Set this to -1 for 'never.' */
368 #define CLOCK_SYNC_INTERVAL 5
369 
370 /** Set 'tp' to the current time according to 'base'.  We must hold the lock
371  * on 'base'.  If there is a cached time, return it.  Otherwise, use
372  * clock_gettime or gettimeofday as appropriate to find out the right time.
373  * Return 0 on success, -1 on failure.
374  */
375 static int
376 gettime(struct event_base *base, struct timeval *tp)
377 {
378 	EVENT_BASE_ASSERT_LOCKED(base);
379 
380 	if (base->tv_cache.tv_sec) {
381 		*tp = base->tv_cache;
382 		return (0);
383 	}
384 
385 	if (evutil_gettime_monotonic_(&base->monotonic_timer, tp) == -1) {
386 		return -1;
387 	}
388 
389 	if (base->last_updated_clock_diff + CLOCK_SYNC_INTERVAL
390 	    < tp->tv_sec) {
391 		struct timeval tv;
392 		evutil_gettimeofday(&tv,NULL);
393 		evutil_timersub(&tv, tp, &base->tv_clock_diff);
394 		base->last_updated_clock_diff = tp->tv_sec;
395 	}
396 
397 	return 0;
398 }
399 
400 int
401 event_base_gettimeofday_cached(struct event_base *base, struct timeval *tv)
402 {
403 	int r;
404 	if (!base) {
405 		base = current_base;
406 		if (!current_base)
407 			return evutil_gettimeofday(tv, NULL);
408 	}
409 
410 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
411 	if (base->tv_cache.tv_sec == 0) {
412 		r = evutil_gettimeofday(tv, NULL);
413 	} else {
414 		evutil_timeradd(&base->tv_cache, &base->tv_clock_diff, tv);
415 		r = 0;
416 	}
417 	EVBASE_RELEASE_LOCK(base, th_base_lock);
418 	return r;
419 }
420 
421 /** Make 'base' have no current cached time. */
422 static inline void
423 clear_time_cache(struct event_base *base)
424 {
425 	base->tv_cache.tv_sec = 0;
426 }
427 
428 /** Replace the cached time in 'base' with the current time. */
429 static inline void
430 update_time_cache(struct event_base *base)
431 {
432 	base->tv_cache.tv_sec = 0;
433 	if (!(base->flags & EVENT_BASE_FLAG_NO_CACHE_TIME))
434 	    gettime(base, &base->tv_cache);
435 }
436 
437 int
438 event_base_update_cache_time(struct event_base *base)
439 {
440 
441 	if (!base) {
442 		base = current_base;
443 		if (!current_base)
444 			return -1;
445 	}
446 
447 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
448 	if (base->running_loop)
449 		update_time_cache(base);
450 	EVBASE_RELEASE_LOCK(base, th_base_lock);
451 	return 0;
452 }
453 
454 static inline struct event *
455 event_callback_to_event(struct event_callback *evcb)
456 {
457 	EVUTIL_ASSERT((evcb->evcb_flags & EVLIST_INIT));
458 	return EVUTIL_UPCAST(evcb, struct event, ev_evcallback);
459 }
460 
461 static inline struct event_callback *
462 event_to_event_callback(struct event *ev)
463 {
464 	return &ev->ev_evcallback;
465 }
466 
467 struct event_base *
468 event_init(void)
469 {
470 	struct event_base *base = event_base_new_with_config(NULL);
471 
472 	if (base == NULL) {
473 		event_errx(1, "%s: Unable to construct event_base", __func__);
474 		return NULL;
475 	}
476 
477 	current_base = base;
478 
479 	return (base);
480 }
481 
482 struct event_base *
483 event_base_new(void)
484 {
485 	struct event_base *base = NULL;
486 	struct event_config *cfg = event_config_new();
487 	if (cfg) {
488 		base = event_base_new_with_config(cfg);
489 		event_config_free(cfg);
490 	}
491 	return base;
492 }
493 
494 /** Return true iff 'method' is the name of a method that 'cfg' tells us to
495  * avoid. */
496 static int
497 event_config_is_avoided_method(const struct event_config *cfg,
498     const char *method)
499 {
500 	struct event_config_entry *entry;
501 
502 	TAILQ_FOREACH(entry, &cfg->entries, next) {
503 		if (entry->avoid_method != NULL &&
504 		    strcmp(entry->avoid_method, method) == 0)
505 			return (1);
506 	}
507 
508 	return (0);
509 }
510 
511 /** Return true iff 'method' is disabled according to the environment. */
512 static int
513 event_is_method_disabled(const char *name)
514 {
515 	char environment[64];
516 	int i;
517 
518 	evutil_snprintf(environment, sizeof(environment), "EVENT_NO%s", name);
519 	for (i = 8; environment[i] != '\0'; ++i)
520 		environment[i] = EVUTIL_TOUPPER_(environment[i]);
521 	/* Note that evutil_getenv_() ignores the environment entirely if
522 	 * we're setuid */
523 	return (evutil_getenv_(environment) != NULL);
524 }
525 
526 int
527 event_base_get_features(const struct event_base *base)
528 {
529 	return base->evsel->features;
530 }
531 
532 void
533 event_enable_debug_mode(void)
534 {
535 #ifndef EVENT__DISABLE_DEBUG_MODE
536 	if (event_debug_mode_on_)
537 		event_errx(1, "%s was called twice!", __func__);
538 	if (event_debug_mode_too_late)
539 		event_errx(1, "%s must be called *before* creating any events "
540 		    "or event_bases",__func__);
541 
542 	event_debug_mode_on_ = 1;
543 
544 	HT_INIT(event_debug_map, &global_debug_map);
545 #endif
546 }
547 
548 void
549 event_disable_debug_mode(void)
550 {
551 #ifndef EVENT__DISABLE_DEBUG_MODE
552 	struct event_debug_entry **ent, *victim;
553 
554 	EVLOCK_LOCK(event_debug_map_lock_, 0);
555 	for (ent = HT_START(event_debug_map, &global_debug_map); ent; ) {
556 		victim = *ent;
557 		ent = HT_NEXT_RMV(event_debug_map, &global_debug_map, ent);
558 		mm_free(victim);
559 	}
560 	HT_CLEAR(event_debug_map, &global_debug_map);
561 	EVLOCK_UNLOCK(event_debug_map_lock_ , 0);
562 
563 	event_debug_mode_on_  = 0;
564 #endif
565 }
566 
567 struct event_base *
568 event_base_new_with_config(const struct event_config *cfg)
569 {
570 	int i;
571 	struct event_base *base;
572 	int should_check_environment;
573 
574 #ifndef EVENT__DISABLE_DEBUG_MODE
575 	event_debug_mode_too_late = 1;
576 #endif
577 
578 	if ((base = mm_calloc(1, sizeof(struct event_base))) == NULL) {
579 		event_warn("%s: calloc", __func__);
580 		return NULL;
581 	}
582 
583 	if (cfg)
584 		base->flags = cfg->flags;
585 
586 	should_check_environment =
587 	    !(cfg && (cfg->flags & EVENT_BASE_FLAG_IGNORE_ENV));
588 
589 	{
590 		struct timeval tmp;
591 		int precise_time =
592 		    cfg && (cfg->flags & EVENT_BASE_FLAG_PRECISE_TIMER);
593 		int flags;
594 		if (should_check_environment && !precise_time) {
595 			precise_time = evutil_getenv_("EVENT_PRECISE_TIMER") != NULL;
596 			base->flags |= EVENT_BASE_FLAG_PRECISE_TIMER;
597 		}
598 		flags = precise_time ? EV_MONOT_PRECISE : 0;
599 		evutil_configure_monotonic_time_(&base->monotonic_timer, flags);
600 
601 		gettime(base, &tmp);
602 	}
603 
604 	min_heap_ctor_(&base->timeheap);
605 
606 	base->sig.ev_signal_pair[0] = -1;
607 	base->sig.ev_signal_pair[1] = -1;
608 	base->th_notify_fd[0] = -1;
609 	base->th_notify_fd[1] = -1;
610 
611 	TAILQ_INIT(&base->active_later_queue);
612 
613 	evmap_io_initmap_(&base->io);
614 	evmap_signal_initmap_(&base->sigmap);
615 	event_changelist_init_(&base->changelist);
616 
617 	base->evbase = NULL;
618 
619 	if (cfg) {
620 		memcpy(&base->max_dispatch_time,
621 		    &cfg->max_dispatch_interval, sizeof(struct timeval));
622 		base->limit_callbacks_after_prio =
623 		    cfg->limit_callbacks_after_prio;
624 	} else {
625 		base->max_dispatch_time.tv_sec = -1;
626 		base->limit_callbacks_after_prio = 1;
627 	}
628 	if (cfg && cfg->max_dispatch_callbacks >= 0) {
629 		base->max_dispatch_callbacks = cfg->max_dispatch_callbacks;
630 	} else {
631 		base->max_dispatch_callbacks = INT_MAX;
632 	}
633 	if (base->max_dispatch_callbacks == INT_MAX &&
634 	    base->max_dispatch_time.tv_sec == -1)
635 		base->limit_callbacks_after_prio = INT_MAX;
636 
637 	for (i = 0; eventops[i] && !base->evbase; i++) {
638 		if (cfg != NULL) {
639 			/* determine if this backend should be avoided */
640 			if (event_config_is_avoided_method(cfg,
641 				eventops[i]->name))
642 				continue;
643 			if ((eventops[i]->features & cfg->require_features)
644 			    != cfg->require_features)
645 				continue;
646 		}
647 
648 		/* also obey the environment variables */
649 		if (should_check_environment &&
650 		    event_is_method_disabled(eventops[i]->name))
651 			continue;
652 
653 		base->evsel = eventops[i];
654 
655 		base->evbase = base->evsel->init(base);
656 	}
657 
658 	if (base->evbase == NULL) {
659 		event_warnx("%s: no event mechanism available",
660 		    __func__);
661 		base->evsel = NULL;
662 		event_base_free(base);
663 		return NULL;
664 	}
665 
666 	if (evutil_getenv_("EVENT_SHOW_METHOD"))
667 		event_msgx("libevent using: %s", base->evsel->name);
668 
669 	/* allocate a single active event queue */
670 	if (event_base_priority_init(base, 1) < 0) {
671 		event_base_free(base);
672 		return NULL;
673 	}
674 
675 	/* prepare for threading */
676 
677 #if !defined(EVENT__DISABLE_THREAD_SUPPORT) && !defined(EVENT__DISABLE_DEBUG_MODE)
678 	event_debug_created_threadable_ctx_ = 1;
679 #endif
680 
681 #ifndef EVENT__DISABLE_THREAD_SUPPORT
682 	if (EVTHREAD_LOCKING_ENABLED() &&
683 	    (!cfg || !(cfg->flags & EVENT_BASE_FLAG_NOLOCK))) {
684 		int r;
685 		EVTHREAD_ALLOC_LOCK(base->th_base_lock, 0);
686 		EVTHREAD_ALLOC_COND(base->current_event_cond);
687 		r = evthread_make_base_notifiable(base);
688 		if (r<0) {
689 			event_warnx("%s: Unable to make base notifiable.", __func__);
690 			event_base_free(base);
691 			return NULL;
692 		}
693 	}
694 #endif
695 
696 #ifdef _WIN32
697 	if (cfg && (cfg->flags & EVENT_BASE_FLAG_STARTUP_IOCP))
698 		event_base_start_iocp_(base, cfg->n_cpus_hint);
699 #endif
700 
701 	return (base);
702 }
703 
704 int
705 event_base_start_iocp_(struct event_base *base, int n_cpus)
706 {
707 #ifdef _WIN32
708 	if (base->iocp)
709 		return 0;
710 	base->iocp = event_iocp_port_launch_(n_cpus);
711 	if (!base->iocp) {
712 		event_warnx("%s: Couldn't launch IOCP", __func__);
713 		return -1;
714 	}
715 	return 0;
716 #else
717 	return -1;
718 #endif
719 }
720 
721 void
722 event_base_stop_iocp_(struct event_base *base)
723 {
724 #ifdef _WIN32
725 	int rv;
726 
727 	if (!base->iocp)
728 		return;
729 	rv = event_iocp_shutdown_(base->iocp, -1);
730 	EVUTIL_ASSERT(rv >= 0);
731 	base->iocp = NULL;
732 #endif
733 }
734 
735 static int
736 event_base_cancel_single_callback_(struct event_base *base,
737     struct event_callback *evcb,
738     int run_finalizers)
739 {
740 	int result = 0;
741 
742 	if (evcb->evcb_flags & EVLIST_INIT) {
743 		struct event *ev = event_callback_to_event(evcb);
744 		if (!(ev->ev_flags & EVLIST_INTERNAL)) {
745 			event_del_(ev, EVENT_DEL_EVEN_IF_FINALIZING);
746 			result = 1;
747 		}
748 	} else {
749 		EVBASE_ACQUIRE_LOCK(base, th_base_lock);
750 		event_callback_cancel_nolock_(base, evcb, 1);
751 		EVBASE_RELEASE_LOCK(base, th_base_lock);
752 		result = 1;
753 	}
754 
755 	if (run_finalizers && (evcb->evcb_flags & EVLIST_FINALIZING)) {
756 		switch (evcb->evcb_closure) {
757 		case EV_CLOSURE_EVENT_FINALIZE:
758 		case EV_CLOSURE_EVENT_FINALIZE_FREE: {
759 			struct event *ev = event_callback_to_event(evcb);
760 			ev->ev_evcallback.evcb_cb_union.evcb_evfinalize(ev, ev->ev_arg);
761 			if (evcb->evcb_closure == EV_CLOSURE_EVENT_FINALIZE_FREE)
762 				mm_free(ev);
763 			break;
764 		}
765 		case EV_CLOSURE_CB_FINALIZE:
766 			evcb->evcb_cb_union.evcb_cbfinalize(evcb, evcb->evcb_arg);
767 			break;
768 		default:
769 			break;
770 		}
771 	}
772 	return result;
773 }
774 
775 static int event_base_free_queues_(struct event_base *base, int run_finalizers)
776 {
777 	int deleted = 0, i;
778 
779 	for (i = 0; i < base->nactivequeues; ++i) {
780 		struct event_callback *evcb, *next;
781 		for (evcb = TAILQ_FIRST(&base->activequeues[i]); evcb; ) {
782 			next = TAILQ_NEXT(evcb, evcb_active_next);
783 			deleted += event_base_cancel_single_callback_(base, evcb, run_finalizers);
784 			evcb = next;
785 		}
786 	}
787 
788 	{
789 		struct event_callback *evcb;
790 		while ((evcb = TAILQ_FIRST(&base->active_later_queue))) {
791 			deleted += event_base_cancel_single_callback_(base, evcb, run_finalizers);
792 		}
793 	}
794 
795 	return deleted;
796 }
797 
798 static void
799 event_base_free_(struct event_base *base, int run_finalizers)
800 {
801 	int i, n_deleted=0;
802 	struct event *ev;
803 	/* XXXX grab the lock? If there is contention when one thread frees
804 	 * the base, then the contending thread will be very sad soon. */
805 
806 	/* event_base_free(NULL) is how to free the current_base if we
807 	 * made it with event_init and forgot to hold a reference to it. */
808 	if (base == NULL && current_base)
809 		base = current_base;
810 	/* Don't actually free NULL. */
811 	if (base == NULL) {
812 		event_warnx("%s: no base to free", __func__);
813 		return;
814 	}
815 	/* XXX(niels) - check for internal events first */
816 
817 #ifdef _WIN32
818 	event_base_stop_iocp_(base);
819 #endif
820 
821 	/* threading fds if we have them */
822 	if (base->th_notify_fd[0] != -1) {
823 		event_del(&base->th_notify);
824 		EVUTIL_CLOSESOCKET(base->th_notify_fd[0]);
825 		if (base->th_notify_fd[1] != -1)
826 			EVUTIL_CLOSESOCKET(base->th_notify_fd[1]);
827 		base->th_notify_fd[0] = -1;
828 		base->th_notify_fd[1] = -1;
829 		event_debug_unassign(&base->th_notify);
830 	}
831 
832 	/* Delete all non-internal events. */
833 	evmap_delete_all_(base);
834 
835 	while ((ev = min_heap_top_(&base->timeheap)) != NULL) {
836 		event_del(ev);
837 		++n_deleted;
838 	}
839 	for (i = 0; i < base->n_common_timeouts; ++i) {
840 		struct common_timeout_list *ctl =
841 		    base->common_timeout_queues[i];
842 		event_del(&ctl->timeout_event); /* Internal; doesn't count */
843 		event_debug_unassign(&ctl->timeout_event);
844 		for (ev = TAILQ_FIRST(&ctl->events); ev; ) {
845 			struct event *next = TAILQ_NEXT(ev,
846 			    ev_timeout_pos.ev_next_with_common_timeout);
847 			if (!(ev->ev_flags & EVLIST_INTERNAL)) {
848 				event_del(ev);
849 				++n_deleted;
850 			}
851 			ev = next;
852 		}
853 		mm_free(ctl);
854 	}
855 	if (base->common_timeout_queues)
856 		mm_free(base->common_timeout_queues);
857 
858 	for (;;) {
859 		/* For finalizers we can register yet another finalizer out from
860 		 * finalizer, and iff finalizer will be in active_later_queue we can
861 		 * add finalizer to activequeues, and we will have events in
862 		 * activequeues after this function returns, which is not what we want
863 		 * (we even have an assertion for this).
864 		 *
865 		 * A simple case is bufferevent with underlying (i.e. filters).
866 		 */
867 		int ii = event_base_free_queues_(base, run_finalizers);
868 		if (!ii) {
869 			break;
870 		}
871 		n_deleted += ii;
872 	}
873 
874 	if (n_deleted)
875 		event_debug(("%s: %d events were still set in base",
876 			__func__, n_deleted));
877 
878 	while (LIST_FIRST(&base->once_events)) {
879 		struct event_once *eonce = LIST_FIRST(&base->once_events);
880 		LIST_REMOVE(eonce, next_once);
881 		mm_free(eonce);
882 	}
883 
884 	if (base->evsel != NULL && base->evsel->dealloc != NULL)
885 		base->evsel->dealloc(base);
886 
887 	for (i = 0; i < base->nactivequeues; ++i)
888 		EVUTIL_ASSERT(TAILQ_EMPTY(&base->activequeues[i]));
889 
890 	EVUTIL_ASSERT(min_heap_empty_(&base->timeheap));
891 	min_heap_dtor_(&base->timeheap);
892 
893 	mm_free(base->activequeues);
894 
895 	evmap_io_clear_(&base->io);
896 	evmap_signal_clear_(&base->sigmap);
897 	event_changelist_freemem_(&base->changelist);
898 
899 	EVTHREAD_FREE_LOCK(base->th_base_lock, 0);
900 	EVTHREAD_FREE_COND(base->current_event_cond);
901 
902 	/* If we're freeing current_base, there won't be a current_base. */
903 	if (base == current_base)
904 		current_base = NULL;
905 	mm_free(base);
906 }
907 
908 void
909 event_base_free_nofinalize(struct event_base *base)
910 {
911 	event_base_free_(base, 0);
912 }
913 
914 void
915 event_base_free(struct event_base *base)
916 {
917 	event_base_free_(base, 1);
918 }
919 
920 /* Fake eventop; used to disable the backend temporarily inside event_reinit
921  * so that we can call event_del() on an event without telling the backend.
922  */
923 static int
924 nil_backend_del(struct event_base *b, evutil_socket_t fd, short old,
925     short events, void *fdinfo)
926 {
927 	return 0;
928 }
929 const struct eventop nil_eventop = {
930 	"nil",
931 	NULL, /* init: unused. */
932 	NULL, /* add: unused. */
933 	nil_backend_del, /* del: used, so needs to be killed. */
934 	NULL, /* dispatch: unused. */
935 	NULL, /* dealloc: unused. */
936 	0, 0, 0
937 };
938 
939 /* reinitialize the event base after a fork */
940 int
941 event_reinit(struct event_base *base)
942 {
943 	const struct eventop *evsel;
944 	int res = 0;
945 	int was_notifiable = 0;
946 	int had_signal_added = 0;
947 
948 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
949 
950 	evsel = base->evsel;
951 
952 	/* check if this event mechanism requires reinit on the backend */
953 	if (evsel->need_reinit) {
954 		/* We're going to call event_del() on our notify events (the
955 		 * ones that tell about signals and wakeup events).  But we
956 		 * don't actually want to tell the backend to change its
957 		 * state, since it might still share some resource (a kqueue,
958 		 * an epoll fd) with the parent process, and we don't want to
959 		 * delete the fds from _that_ backend, we temporarily stub out
960 		 * the evsel with a replacement.
961 		 */
962 		base->evsel = &nil_eventop;
963 	}
964 
965 	/* We need to re-create a new signal-notification fd and a new
966 	 * thread-notification fd.  Otherwise, we'll still share those with
967 	 * the parent process, which would make any notification sent to them
968 	 * get received by one or both of the event loops, more or less at
969 	 * random.
970 	 */
971 	if (base->sig.ev_signal_added) {
972 		event_del_nolock_(&base->sig.ev_signal, EVENT_DEL_AUTOBLOCK);
973 		event_debug_unassign(&base->sig.ev_signal);
974 		memset(&base->sig.ev_signal, 0, sizeof(base->sig.ev_signal));
975 		had_signal_added = 1;
976 		base->sig.ev_signal_added = 0;
977 	}
978 	if (base->sig.ev_signal_pair[0] != -1)
979 		EVUTIL_CLOSESOCKET(base->sig.ev_signal_pair[0]);
980 	if (base->sig.ev_signal_pair[1] != -1)
981 		EVUTIL_CLOSESOCKET(base->sig.ev_signal_pair[1]);
982 	if (base->th_notify_fn != NULL) {
983 		was_notifiable = 1;
984 		base->th_notify_fn = NULL;
985 	}
986 	if (base->th_notify_fd[0] != -1) {
987 		event_del_nolock_(&base->th_notify, EVENT_DEL_AUTOBLOCK);
988 		EVUTIL_CLOSESOCKET(base->th_notify_fd[0]);
989 		if (base->th_notify_fd[1] != -1)
990 			EVUTIL_CLOSESOCKET(base->th_notify_fd[1]);
991 		base->th_notify_fd[0] = -1;
992 		base->th_notify_fd[1] = -1;
993 		event_debug_unassign(&base->th_notify);
994 	}
995 
996 	/* Replace the original evsel. */
997         base->evsel = evsel;
998 
999 	if (evsel->need_reinit) {
1000 		/* Reconstruct the backend through brute-force, so that we do
1001 		 * not share any structures with the parent process. For some
1002 		 * backends, this is necessary: epoll and kqueue, for
1003 		 * instance, have events associated with a kernel
1004 		 * structure. If didn't reinitialize, we'd share that
1005 		 * structure with the parent process, and any changes made by
1006 		 * the parent would affect our backend's behavior (and vice
1007 		 * versa).
1008 		 */
1009 		if (base->evsel->dealloc != NULL)
1010 			base->evsel->dealloc(base);
1011 		base->evbase = evsel->init(base);
1012 		if (base->evbase == NULL) {
1013 			event_errx(1,
1014 			   "%s: could not reinitialize event mechanism",
1015 			   __func__);
1016 			res = -1;
1017 			goto done;
1018 		}
1019 
1020 		/* Empty out the changelist (if any): we are starting from a
1021 		 * blank slate. */
1022 		event_changelist_freemem_(&base->changelist);
1023 
1024 		/* Tell the event maps to re-inform the backend about all
1025 		 * pending events. This will make the signal notification
1026 		 * event get re-created if necessary. */
1027 		if (evmap_reinit_(base) < 0)
1028 			res = -1;
1029 	} else {
1030 		res = evsig_init_(base);
1031 		if (res == 0 && had_signal_added) {
1032 			res = event_add_nolock_(&base->sig.ev_signal, NULL, 0);
1033 			if (res == 0)
1034 				base->sig.ev_signal_added = 1;
1035 		}
1036 	}
1037 
1038 	/* If we were notifiable before, and nothing just exploded, become
1039 	 * notifiable again. */
1040 	if (was_notifiable && res == 0)
1041 		res = evthread_make_base_notifiable_nolock_(base);
1042 
1043 done:
1044 	EVBASE_RELEASE_LOCK(base, th_base_lock);
1045 	return (res);
1046 }
1047 
1048 /* Get the monotonic time for this event_base' timer */
1049 int
1050 event_gettime_monotonic(struct event_base *base, struct timeval *tv)
1051 {
1052   int rv = -1;
1053 
1054   if (base && tv) {
1055     EVBASE_ACQUIRE_LOCK(base, th_base_lock);
1056     rv = evutil_gettime_monotonic_(&(base->monotonic_timer), tv);
1057     EVBASE_RELEASE_LOCK(base, th_base_lock);
1058   }
1059 
1060   return rv;
1061 }
1062 
1063 const char **
1064 event_get_supported_methods(void)
1065 {
1066 	static const char **methods = NULL;
1067 	const struct eventop **method;
1068 	const char **tmp;
1069 	int i = 0, k;
1070 
1071 	/* count all methods */
1072 	for (method = &eventops[0]; *method != NULL; ++method) {
1073 		++i;
1074 	}
1075 
1076 	/* allocate one more than we need for the NULL pointer */
1077 	tmp = mm_calloc((i + 1), sizeof(char *));
1078 	if (tmp == NULL)
1079 		return (NULL);
1080 
1081 	/* populate the array with the supported methods */
1082 	for (k = 0, i = 0; eventops[k] != NULL; ++k) {
1083 		tmp[i++] = eventops[k]->name;
1084 	}
1085 	tmp[i] = NULL;
1086 
1087 	if (methods != NULL)
1088 		mm_free(__UNCONST(methods));
1089 
1090 	methods = tmp;
1091 
1092 	return (methods);
1093 }
1094 
1095 struct event_config *
1096 event_config_new(void)
1097 {
1098 	struct event_config *cfg = mm_calloc(1, sizeof(*cfg));
1099 
1100 	if (cfg == NULL)
1101 		return (NULL);
1102 
1103 	TAILQ_INIT(&cfg->entries);
1104 	cfg->max_dispatch_interval.tv_sec = -1;
1105 	cfg->max_dispatch_callbacks = INT_MAX;
1106 	cfg->limit_callbacks_after_prio = 1;
1107 
1108 	return (cfg);
1109 }
1110 
1111 static void
1112 event_config_entry_free(struct event_config_entry *entry)
1113 {
1114 	if (entry->avoid_method != NULL)
1115 		mm_free(__UNCONST(entry->avoid_method));
1116 	mm_free(entry);
1117 }
1118 
1119 void
1120 event_config_free(struct event_config *cfg)
1121 {
1122 	struct event_config_entry *entry;
1123 
1124 	while ((entry = TAILQ_FIRST(&cfg->entries)) != NULL) {
1125 		TAILQ_REMOVE(&cfg->entries, entry, next);
1126 		event_config_entry_free(entry);
1127 	}
1128 	mm_free(cfg);
1129 }
1130 
1131 int
1132 event_config_set_flag(struct event_config *cfg, int flag)
1133 {
1134 	if (!cfg)
1135 		return -1;
1136 	cfg->flags |= flag;
1137 	return 0;
1138 }
1139 
1140 int
1141 event_config_avoid_method(struct event_config *cfg, const char *method)
1142 {
1143 	struct event_config_entry *entry = mm_malloc(sizeof(*entry));
1144 	if (entry == NULL)
1145 		return (-1);
1146 
1147 	if ((entry->avoid_method = mm_strdup(method)) == NULL) {
1148 		mm_free(entry);
1149 		return (-1);
1150 	}
1151 
1152 	TAILQ_INSERT_TAIL(&cfg->entries, entry, next);
1153 
1154 	return (0);
1155 }
1156 
1157 int
1158 event_config_require_features(struct event_config *cfg,
1159     int features)
1160 {
1161 	if (!cfg)
1162 		return (-1);
1163 	cfg->require_features = features;
1164 	return (0);
1165 }
1166 
1167 int
1168 event_config_set_num_cpus_hint(struct event_config *cfg, int cpus)
1169 {
1170 	if (!cfg)
1171 		return (-1);
1172 	cfg->n_cpus_hint = cpus;
1173 	return (0);
1174 }
1175 
1176 int
1177 event_config_set_max_dispatch_interval(struct event_config *cfg,
1178     const struct timeval *max_interval, int max_callbacks, int min_priority)
1179 {
1180 	if (max_interval)
1181 		memcpy(&cfg->max_dispatch_interval, max_interval,
1182 		    sizeof(struct timeval));
1183 	else
1184 		cfg->max_dispatch_interval.tv_sec = -1;
1185 	cfg->max_dispatch_callbacks =
1186 	    max_callbacks >= 0 ? max_callbacks : INT_MAX;
1187 	if (min_priority < 0)
1188 		min_priority = 0;
1189 	cfg->limit_callbacks_after_prio = min_priority;
1190 	return (0);
1191 }
1192 
1193 int
1194 event_priority_init(int npriorities)
1195 {
1196 	return event_base_priority_init(current_base, npriorities);
1197 }
1198 
1199 int
1200 event_base_priority_init(struct event_base *base, int npriorities)
1201 {
1202 	int i, r;
1203 	r = -1;
1204 
1205 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
1206 
1207 	if (N_ACTIVE_CALLBACKS(base) || npriorities < 1
1208 	    || npriorities >= EVENT_MAX_PRIORITIES)
1209 		goto err;
1210 
1211 	if (npriorities == base->nactivequeues)
1212 		goto ok;
1213 
1214 	if (base->nactivequeues) {
1215 		mm_free(base->activequeues);
1216 		base->nactivequeues = 0;
1217 	}
1218 
1219 	/* Allocate our priority queues */
1220 	base->activequeues = (struct evcallback_list *)
1221 	  mm_calloc(npriorities, sizeof(struct evcallback_list));
1222 	if (base->activequeues == NULL) {
1223 		event_warn("%s: calloc", __func__);
1224 		goto err;
1225 	}
1226 	base->nactivequeues = npriorities;
1227 
1228 	for (i = 0; i < base->nactivequeues; ++i) {
1229 		TAILQ_INIT(&base->activequeues[i]);
1230 	}
1231 
1232 ok:
1233 	r = 0;
1234 err:
1235 	EVBASE_RELEASE_LOCK(base, th_base_lock);
1236 	return (r);
1237 }
1238 
1239 int
1240 event_base_get_npriorities(struct event_base *base)
1241 {
1242 
1243 	int n;
1244 	if (base == NULL)
1245 		base = current_base;
1246 
1247 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
1248 	n = base->nactivequeues;
1249 	EVBASE_RELEASE_LOCK(base, th_base_lock);
1250 	return (n);
1251 }
1252 
1253 int
1254 event_base_get_num_events(struct event_base *base, unsigned int type)
1255 {
1256 	int r = 0;
1257 
1258 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
1259 
1260 	if (type & EVENT_BASE_COUNT_ACTIVE)
1261 		r += base->event_count_active;
1262 
1263 	if (type & EVENT_BASE_COUNT_VIRTUAL)
1264 		r += base->virtual_event_count;
1265 
1266 	if (type & EVENT_BASE_COUNT_ADDED)
1267 		r += base->event_count;
1268 
1269 	EVBASE_RELEASE_LOCK(base, th_base_lock);
1270 
1271 	return r;
1272 }
1273 
1274 int
1275 event_base_get_max_events(struct event_base *base, unsigned int type, int clear)
1276 {
1277 	int r = 0;
1278 
1279 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
1280 
1281 	if (type & EVENT_BASE_COUNT_ACTIVE) {
1282 		r += base->event_count_active_max;
1283 		if (clear)
1284 			base->event_count_active_max = 0;
1285 	}
1286 
1287 	if (type & EVENT_BASE_COUNT_VIRTUAL) {
1288 		r += base->virtual_event_count_max;
1289 		if (clear)
1290 			base->virtual_event_count_max = 0;
1291 	}
1292 
1293 	if (type & EVENT_BASE_COUNT_ADDED) {
1294 		r += base->event_count_max;
1295 		if (clear)
1296 			base->event_count_max = 0;
1297 	}
1298 
1299 	EVBASE_RELEASE_LOCK(base, th_base_lock);
1300 
1301 	return r;
1302 }
1303 
1304 /* Returns true iff we're currently watching any events. */
1305 static int
1306 event_haveevents(struct event_base *base)
1307 {
1308 	/* Caller must hold th_base_lock */
1309 	return (base->virtual_event_count > 0 || base->event_count > 0);
1310 }
1311 
1312 /* "closure" function called when processing active signal events */
1313 static inline void
1314 event_signal_closure(struct event_base *base, struct event *ev)
1315 {
1316 	short ncalls;
1317 	int should_break;
1318 
1319 	/* Allows deletes to work */
1320 	ncalls = ev->ev_ncalls;
1321 	if (ncalls != 0)
1322 		ev->ev_pncalls = &ncalls;
1323 	EVBASE_RELEASE_LOCK(base, th_base_lock);
1324 	while (ncalls) {
1325 		ncalls--;
1326 		ev->ev_ncalls = ncalls;
1327 		if (ncalls == 0)
1328 			ev->ev_pncalls = NULL;
1329 		(*ev->ev_callback)(ev->ev_fd, ev->ev_res, ev->ev_arg);
1330 
1331 		EVBASE_ACQUIRE_LOCK(base, th_base_lock);
1332 		should_break = base->event_break;
1333 		EVBASE_RELEASE_LOCK(base, th_base_lock);
1334 
1335 		if (should_break) {
1336 			if (ncalls != 0)
1337 				ev->ev_pncalls = NULL;
1338 			return;
1339 		}
1340 	}
1341 }
1342 
1343 /* Common timeouts are special timeouts that are handled as queues rather than
1344  * in the minheap.  This is more efficient than the minheap if we happen to
1345  * know that we're going to get several thousands of timeout events all with
1346  * the same timeout value.
1347  *
1348  * Since all our timeout handling code assumes timevals can be copied,
1349  * assigned, etc, we can't use "magic pointer" to encode these common
1350  * timeouts.  Searching through a list to see if every timeout is common could
1351  * also get inefficient.  Instead, we take advantage of the fact that tv_usec
1352  * is 32 bits long, but only uses 20 of those bits (since it can never be over
1353  * 999999.)  We use the top bits to encode 4 bites of magic number, and 8 bits
1354  * of index into the event_base's aray of common timeouts.
1355  */
1356 
1357 #define MICROSECONDS_MASK       COMMON_TIMEOUT_MICROSECONDS_MASK
1358 #define COMMON_TIMEOUT_IDX_MASK 0x0ff00000
1359 #define COMMON_TIMEOUT_IDX_SHIFT 20
1360 #define COMMON_TIMEOUT_MASK     0xf0000000
1361 #define COMMON_TIMEOUT_MAGIC    0x50000000
1362 
1363 #define COMMON_TIMEOUT_IDX(tv) \
1364 	(((tv)->tv_usec & COMMON_TIMEOUT_IDX_MASK)>>COMMON_TIMEOUT_IDX_SHIFT)
1365 
1366 /** Return true iff if 'tv' is a common timeout in 'base' */
1367 static inline int
1368 is_common_timeout(const struct timeval *tv,
1369     const struct event_base *base)
1370 {
1371 	int idx;
1372 	if ((tv->tv_usec & COMMON_TIMEOUT_MASK) != COMMON_TIMEOUT_MAGIC)
1373 		return 0;
1374 	idx = COMMON_TIMEOUT_IDX(tv);
1375 	return idx < base->n_common_timeouts;
1376 }
1377 
1378 /* True iff tv1 and tv2 have the same common-timeout index, or if neither
1379  * one is a common timeout. */
1380 static inline int
1381 is_same_common_timeout(const struct timeval *tv1, const struct timeval *tv2)
1382 {
1383 	return (tv1->tv_usec & ~MICROSECONDS_MASK) ==
1384 	    (tv2->tv_usec & ~MICROSECONDS_MASK);
1385 }
1386 
1387 /** Requires that 'tv' is a common timeout.  Return the corresponding
1388  * common_timeout_list. */
1389 static inline struct common_timeout_list *
1390 get_common_timeout_list(struct event_base *base, const struct timeval *tv)
1391 {
1392 	return base->common_timeout_queues[COMMON_TIMEOUT_IDX(tv)];
1393 }
1394 
1395 #if 0
1396 static inline int
1397 common_timeout_ok(const struct timeval *tv,
1398     struct event_base *base)
1399 {
1400 	const struct timeval *expect =
1401 	    &get_common_timeout_list(base, tv)->duration;
1402 	return tv->tv_sec == expect->tv_sec &&
1403 	    tv->tv_usec == expect->tv_usec;
1404 }
1405 #endif
1406 
1407 /* Add the timeout for the first event in given common timeout list to the
1408  * event_base's minheap. */
1409 static void
1410 common_timeout_schedule(struct common_timeout_list *ctl,
1411     const struct timeval *now, struct event *head)
1412 {
1413 	struct timeval timeout = head->ev_timeout;
1414 	timeout.tv_usec &= MICROSECONDS_MASK;
1415 	event_add_nolock_(&ctl->timeout_event, &timeout, 1);
1416 }
1417 
1418 /* Callback: invoked when the timeout for a common timeout queue triggers.
1419  * This means that (at least) the first event in that queue should be run,
1420  * and the timeout should be rescheduled if there are more events. */
1421 static void
1422 common_timeout_callback(evutil_socket_t fd, short what, void *arg)
1423 {
1424 	struct timeval now;
1425 	struct common_timeout_list *ctl = arg;
1426 	struct event_base *base = ctl->base;
1427 	struct event *ev = NULL;
1428 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
1429 	gettime(base, &now);
1430 	while (1) {
1431 		ev = TAILQ_FIRST(&ctl->events);
1432 		if (!ev || ev->ev_timeout.tv_sec > now.tv_sec ||
1433 		    (ev->ev_timeout.tv_sec == now.tv_sec &&
1434 			(ev->ev_timeout.tv_usec&MICROSECONDS_MASK) > now.tv_usec))
1435 			break;
1436 		event_del_nolock_(ev, EVENT_DEL_NOBLOCK);
1437 		event_active_nolock_(ev, EV_TIMEOUT, 1);
1438 	}
1439 	if (ev)
1440 		common_timeout_schedule(ctl, &now, ev);
1441 	EVBASE_RELEASE_LOCK(base, th_base_lock);
1442 }
1443 
1444 #define MAX_COMMON_TIMEOUTS 256
1445 
1446 const struct timeval *
1447 event_base_init_common_timeout(struct event_base *base,
1448     const struct timeval *duration)
1449 {
1450 	int i;
1451 	struct timeval tv;
1452 	const struct timeval *result=NULL;
1453 	struct common_timeout_list *new_ctl;
1454 
1455 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
1456 	if (duration->tv_usec > 1000000) {
1457 		memcpy(&tv, duration, sizeof(struct timeval));
1458 		if (is_common_timeout(duration, base))
1459 			tv.tv_usec &= MICROSECONDS_MASK;
1460 		tv.tv_sec += tv.tv_usec / 1000000;
1461 		tv.tv_usec %= 1000000;
1462 		duration = &tv;
1463 	}
1464 	for (i = 0; i < base->n_common_timeouts; ++i) {
1465 		const struct common_timeout_list *ctl =
1466 		    base->common_timeout_queues[i];
1467 		if (duration->tv_sec == ctl->duration.tv_sec &&
1468 		    duration->tv_usec ==
1469 		    (ctl->duration.tv_usec & MICROSECONDS_MASK)) {
1470 			EVUTIL_ASSERT(is_common_timeout(&ctl->duration, base));
1471 			result = &ctl->duration;
1472 			goto done;
1473 		}
1474 	}
1475 	if (base->n_common_timeouts == MAX_COMMON_TIMEOUTS) {
1476 		event_warnx("%s: Too many common timeouts already in use; "
1477 		    "we only support %d per event_base", __func__,
1478 		    MAX_COMMON_TIMEOUTS);
1479 		goto done;
1480 	}
1481 	if (base->n_common_timeouts_allocated == base->n_common_timeouts) {
1482 		int n = base->n_common_timeouts < 16 ? 16 :
1483 		    base->n_common_timeouts*2;
1484 		struct common_timeout_list **newqueues =
1485 		    mm_realloc(base->common_timeout_queues,
1486 			n*sizeof(struct common_timeout_queue *));
1487 		if (!newqueues) {
1488 			event_warn("%s: realloc",__func__);
1489 			goto done;
1490 		}
1491 		base->n_common_timeouts_allocated = n;
1492 		base->common_timeout_queues = newqueues;
1493 	}
1494 	new_ctl = mm_calloc(1, sizeof(struct common_timeout_list));
1495 	if (!new_ctl) {
1496 		event_warn("%s: calloc",__func__);
1497 		goto done;
1498 	}
1499 	TAILQ_INIT(&new_ctl->events);
1500 	new_ctl->duration.tv_sec = duration->tv_sec;
1501 	new_ctl->duration.tv_usec =
1502 	    duration->tv_usec | COMMON_TIMEOUT_MAGIC |
1503 	    (base->n_common_timeouts << COMMON_TIMEOUT_IDX_SHIFT);
1504 	evtimer_assign(&new_ctl->timeout_event, base,
1505 	    common_timeout_callback, new_ctl);
1506 	new_ctl->timeout_event.ev_flags |= EVLIST_INTERNAL;
1507 	event_priority_set(&new_ctl->timeout_event, 0);
1508 	new_ctl->base = base;
1509 	base->common_timeout_queues[base->n_common_timeouts++] = new_ctl;
1510 	result = &new_ctl->duration;
1511 
1512 done:
1513 	if (result)
1514 		EVUTIL_ASSERT(is_common_timeout(result, base));
1515 
1516 	EVBASE_RELEASE_LOCK(base, th_base_lock);
1517 	return result;
1518 }
1519 
1520 /* Closure function invoked when we're activating a persistent event. */
1521 static inline void
1522 event_persist_closure(struct event_base *base, struct event *ev)
1523 {
1524 	void (*evcb_callback)(evutil_socket_t, short, void *);
1525 
1526         // Other fields of *ev that must be stored before executing
1527         evutil_socket_t evcb_fd;
1528         short evcb_res;
1529         void *evcb_arg;
1530 
1531 	/* reschedule the persistent event if we have a timeout. */
1532 	if (ev->ev_io_timeout.tv_sec || ev->ev_io_timeout.tv_usec) {
1533 		/* If there was a timeout, we want it to run at an interval of
1534 		 * ev_io_timeout after the last time it was _scheduled_ for,
1535 		 * not ev_io_timeout after _now_.  If it fired for another
1536 		 * reason, though, the timeout ought to start ticking _now_. */
1537 		struct timeval run_at, relative_to, delay, now;
1538 		ev_uint32_t usec_mask = 0;
1539 		EVUTIL_ASSERT(is_same_common_timeout(&ev->ev_timeout,
1540 			&ev->ev_io_timeout));
1541 		gettime(base, &now);
1542 		if (is_common_timeout(&ev->ev_timeout, base)) {
1543 			delay = ev->ev_io_timeout;
1544 			usec_mask = delay.tv_usec & ~MICROSECONDS_MASK;
1545 			delay.tv_usec &= MICROSECONDS_MASK;
1546 			if (ev->ev_res & EV_TIMEOUT) {
1547 				relative_to = ev->ev_timeout;
1548 				relative_to.tv_usec &= MICROSECONDS_MASK;
1549 			} else {
1550 				relative_to = now;
1551 			}
1552 		} else {
1553 			delay = ev->ev_io_timeout;
1554 			if (ev->ev_res & EV_TIMEOUT) {
1555 				relative_to = ev->ev_timeout;
1556 			} else {
1557 				relative_to = now;
1558 			}
1559 		}
1560 		evutil_timeradd(&relative_to, &delay, &run_at);
1561 		if (evutil_timercmp(&run_at, &now, <)) {
1562 			/* Looks like we missed at least one invocation due to
1563 			 * a clock jump, not running the event loop for a
1564 			 * while, really slow callbacks, or
1565 			 * something. Reschedule relative to now.
1566 			 */
1567 			evutil_timeradd(&now, &delay, &run_at);
1568 		}
1569 		run_at.tv_usec |= usec_mask;
1570 		event_add_nolock_(ev, &run_at, 1);
1571 	}
1572 
1573 	// Save our callback before we release the lock
1574 	evcb_callback = ev->ev_callback;
1575         evcb_fd = ev->ev_fd;
1576         evcb_res = ev->ev_res;
1577         evcb_arg = ev->ev_arg;
1578 
1579 	// Release the lock
1580  	EVBASE_RELEASE_LOCK(base, th_base_lock);
1581 
1582 	// Execute the callback
1583         (evcb_callback)(evcb_fd, evcb_res, evcb_arg);
1584 }
1585 
1586 /*
1587   Helper for event_process_active to process all the events in a single queue,
1588   releasing the lock as we go.  This function requires that the lock be held
1589   when it's invoked.  Returns -1 if we get a signal or an event_break that
1590   means we should stop processing any active events now.  Otherwise returns
1591   the number of non-internal event_callbacks that we processed.
1592 */
1593 static int
1594 event_process_active_single_queue(struct event_base *base,
1595     struct evcallback_list *activeq,
1596     int max_to_process, const struct timeval *endtime)
1597 {
1598 	struct event_callback *evcb;
1599 	int count = 0;
1600 
1601 	EVUTIL_ASSERT(activeq != NULL);
1602 
1603 	for (evcb = TAILQ_FIRST(activeq); evcb; evcb = TAILQ_FIRST(activeq)) {
1604 		struct event *ev=NULL;
1605 		if (evcb->evcb_flags & EVLIST_INIT) {
1606 			ev = event_callback_to_event(evcb);
1607 
1608 			if (ev->ev_events & EV_PERSIST || ev->ev_flags & EVLIST_FINALIZING)
1609 				event_queue_remove_active(base, evcb);
1610 			else
1611 				event_del_nolock_(ev, EVENT_DEL_NOBLOCK);
1612 			event_debug((
1613 			    "event_process_active: event: %p, %s%s%scall %p",
1614 			    ev,
1615 			    ev->ev_res & EV_READ ? "EV_READ " : " ",
1616 			    ev->ev_res & EV_WRITE ? "EV_WRITE " : " ",
1617 			    ev->ev_res & EV_CLOSED ? "EV_CLOSED " : " ",
1618 			    ev->ev_callback));
1619 		} else {
1620 			event_queue_remove_active(base, evcb);
1621 			event_debug(("event_process_active: event_callback %p, "
1622 				"closure %d, call %p",
1623 				evcb, evcb->evcb_closure, evcb->evcb_cb_union.evcb_callback));
1624 		}
1625 
1626 		if (!(evcb->evcb_flags & EVLIST_INTERNAL))
1627 			++count;
1628 
1629 
1630 		base->current_event = evcb;
1631 #ifndef EVENT__DISABLE_THREAD_SUPPORT
1632 		base->current_event_waiters = 0;
1633 #endif
1634 
1635 		switch (evcb->evcb_closure) {
1636 		case EV_CLOSURE_EVENT_SIGNAL:
1637 			EVUTIL_ASSERT(ev != NULL);
1638 			event_signal_closure(base, ev);
1639 			break;
1640 		case EV_CLOSURE_EVENT_PERSIST:
1641 			EVUTIL_ASSERT(ev != NULL);
1642 			event_persist_closure(base, ev);
1643 			break;
1644 		case EV_CLOSURE_EVENT: {
1645 			void (*evcb_callback)(evutil_socket_t, short, void *);
1646 			EVUTIL_ASSERT(ev != NULL);
1647 			evcb_callback = *ev->ev_callback;
1648 			EVBASE_RELEASE_LOCK(base, th_base_lock);
1649 			evcb_callback(ev->ev_fd, ev->ev_res, ev->ev_arg);
1650 		}
1651 		break;
1652 		case EV_CLOSURE_CB_SELF: {
1653 			void (*evcb_selfcb)(struct event_callback *, void *) = evcb->evcb_cb_union.evcb_selfcb;
1654 			EVBASE_RELEASE_LOCK(base, th_base_lock);
1655 			evcb_selfcb(evcb, evcb->evcb_arg);
1656 		}
1657 		break;
1658 		case EV_CLOSURE_EVENT_FINALIZE:
1659 		case EV_CLOSURE_EVENT_FINALIZE_FREE: {
1660 			void (*evcb_evfinalize)(struct event *, void *);
1661 			int evcb_closure = evcb->evcb_closure;
1662 			EVUTIL_ASSERT(ev != NULL);
1663 			base->current_event = NULL;
1664 			evcb_evfinalize = ev->ev_evcallback.evcb_cb_union.evcb_evfinalize;
1665 			EVUTIL_ASSERT((evcb->evcb_flags & EVLIST_FINALIZING));
1666 			EVBASE_RELEASE_LOCK(base, th_base_lock);
1667 			evcb_evfinalize(ev, ev->ev_arg);
1668 			event_debug_note_teardown_(ev);
1669 			if (evcb_closure == EV_CLOSURE_EVENT_FINALIZE_FREE)
1670 				mm_free(ev);
1671 		}
1672 		break;
1673 		case EV_CLOSURE_CB_FINALIZE: {
1674 			void (*evcb_cbfinalize)(struct event_callback *, void *) = evcb->evcb_cb_union.evcb_cbfinalize;
1675 			base->current_event = NULL;
1676 			EVUTIL_ASSERT((evcb->evcb_flags & EVLIST_FINALIZING));
1677 			EVBASE_RELEASE_LOCK(base, th_base_lock);
1678 			evcb_cbfinalize(evcb, evcb->evcb_arg);
1679 		}
1680 		break;
1681 		default:
1682 			EVUTIL_ASSERT(0);
1683 		}
1684 
1685 		EVBASE_ACQUIRE_LOCK(base, th_base_lock);
1686 		base->current_event = NULL;
1687 #ifndef EVENT__DISABLE_THREAD_SUPPORT
1688 		if (base->current_event_waiters) {
1689 			base->current_event_waiters = 0;
1690 			EVTHREAD_COND_BROADCAST(base->current_event_cond);
1691 		}
1692 #endif
1693 
1694 		if (base->event_break)
1695 			return -1;
1696 		if (count >= max_to_process)
1697 			return count;
1698 		if (count && endtime) {
1699 			struct timeval now;
1700 			update_time_cache(base);
1701 			gettime(base, &now);
1702 			if (evutil_timercmp(&now, endtime, >=))
1703 				return count;
1704 		}
1705 		if (base->event_continue)
1706 			break;
1707 	}
1708 	return count;
1709 }
1710 
1711 /*
1712  * Active events are stored in priority queues.  Lower priorities are always
1713  * process before higher priorities.  Low priority events can starve high
1714  * priority ones.
1715  */
1716 
1717 static int
1718 event_process_active(struct event_base *base)
1719 {
1720 	/* Caller must hold th_base_lock */
1721 	struct evcallback_list *activeq = NULL;
1722 	int i, c = 0;
1723 	const struct timeval *endtime;
1724 	struct timeval tv;
1725 	const int maxcb = base->max_dispatch_callbacks;
1726 	const int limit_after_prio = base->limit_callbacks_after_prio;
1727 	if (base->max_dispatch_time.tv_sec >= 0) {
1728 		update_time_cache(base);
1729 		gettime(base, &tv);
1730 		evutil_timeradd(&base->max_dispatch_time, &tv, &tv);
1731 		endtime = &tv;
1732 	} else {
1733 		endtime = NULL;
1734 	}
1735 
1736 	for (i = 0; i < base->nactivequeues; ++i) {
1737 		if (TAILQ_FIRST(&base->activequeues[i]) != NULL) {
1738 			base->event_running_priority = i;
1739 			activeq = &base->activequeues[i];
1740 			if (i < limit_after_prio)
1741 				c = event_process_active_single_queue(base, activeq,
1742 				    INT_MAX, NULL);
1743 			else
1744 				c = event_process_active_single_queue(base, activeq,
1745 				    maxcb, endtime);
1746 			if (c < 0) {
1747 				goto done;
1748 			} else if (c > 0)
1749 				break; /* Processed a real event; do not
1750 					* consider lower-priority events */
1751 			/* If we get here, all of the events we processed
1752 			 * were internal.  Continue. */
1753 		}
1754 	}
1755 
1756 done:
1757 	base->event_running_priority = -1;
1758 
1759 	return c;
1760 }
1761 
1762 /*
1763  * Wait continuously for events.  We exit only if no events are left.
1764  */
1765 
1766 int
1767 event_dispatch(void)
1768 {
1769 	return (event_loop(0));
1770 }
1771 
1772 int
1773 event_base_dispatch(struct event_base *event_base)
1774 {
1775 	return (event_base_loop(event_base, 0));
1776 }
1777 
1778 const char *
1779 event_base_get_method(const struct event_base *base)
1780 {
1781 	EVUTIL_ASSERT(base);
1782 	return (base->evsel->name);
1783 }
1784 
1785 /** Callback: used to implement event_base_loopexit by telling the event_base
1786  * that it's time to exit its loop. */
1787 static void
1788 event_loopexit_cb(evutil_socket_t fd, short what, void *arg)
1789 {
1790 	struct event_base *base = arg;
1791 	base->event_gotterm = 1;
1792 }
1793 
1794 int
1795 event_loopexit(const struct timeval *tv)
1796 {
1797 	return (event_once(-1, EV_TIMEOUT, event_loopexit_cb,
1798 		    current_base, tv));
1799 }
1800 
1801 int
1802 event_base_loopexit(struct event_base *event_base, const struct timeval *tv)
1803 {
1804 	return (event_base_once(event_base, -1, EV_TIMEOUT, event_loopexit_cb,
1805 		    event_base, tv));
1806 }
1807 
1808 int
1809 event_loopbreak(void)
1810 {
1811 	return (event_base_loopbreak(current_base));
1812 }
1813 
1814 int
1815 event_base_loopbreak(struct event_base *event_base)
1816 {
1817 	int r = 0;
1818 	if (event_base == NULL)
1819 		return (-1);
1820 
1821 	EVBASE_ACQUIRE_LOCK(event_base, th_base_lock);
1822 	event_base->event_break = 1;
1823 
1824 	if (EVBASE_NEED_NOTIFY(event_base)) {
1825 		r = evthread_notify_base(event_base);
1826 	} else {
1827 		r = (0);
1828 	}
1829 	EVBASE_RELEASE_LOCK(event_base, th_base_lock);
1830 	return r;
1831 }
1832 
1833 int
1834 event_base_loopcontinue(struct event_base *event_base)
1835 {
1836 	int r = 0;
1837 	if (event_base == NULL)
1838 		return (-1);
1839 
1840 	EVBASE_ACQUIRE_LOCK(event_base, th_base_lock);
1841 	event_base->event_continue = 1;
1842 
1843 	if (EVBASE_NEED_NOTIFY(event_base)) {
1844 		r = evthread_notify_base(event_base);
1845 	} else {
1846 		r = (0);
1847 	}
1848 	EVBASE_RELEASE_LOCK(event_base, th_base_lock);
1849 	return r;
1850 }
1851 
1852 int
1853 event_base_got_break(struct event_base *event_base)
1854 {
1855 	int res;
1856 	EVBASE_ACQUIRE_LOCK(event_base, th_base_lock);
1857 	res = event_base->event_break;
1858 	EVBASE_RELEASE_LOCK(event_base, th_base_lock);
1859 	return res;
1860 }
1861 
1862 int
1863 event_base_got_exit(struct event_base *event_base)
1864 {
1865 	int res;
1866 	EVBASE_ACQUIRE_LOCK(event_base, th_base_lock);
1867 	res = event_base->event_gotterm;
1868 	EVBASE_RELEASE_LOCK(event_base, th_base_lock);
1869 	return res;
1870 }
1871 
1872 /* not thread safe */
1873 
1874 int
1875 event_loop(int flags)
1876 {
1877 	return event_base_loop(current_base, flags);
1878 }
1879 
1880 int
1881 event_base_loop(struct event_base *base, int flags)
1882 {
1883 	const struct eventop *evsel = base->evsel;
1884 	struct timeval tv;
1885 	struct timeval *tv_p;
1886 	int res, done, retval = 0;
1887 
1888 	/* Grab the lock.  We will release it inside evsel.dispatch, and again
1889 	 * as we invoke user callbacks. */
1890 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
1891 
1892 	if (base->running_loop) {
1893 		event_warnx("%s: reentrant invocation.  Only one event_base_loop"
1894 		    " can run on each event_base at once.", __func__);
1895 		EVBASE_RELEASE_LOCK(base, th_base_lock);
1896 		return -1;
1897 	}
1898 
1899 	base->running_loop = 1;
1900 
1901 	clear_time_cache(base);
1902 
1903 	if (base->sig.ev_signal_added && base->sig.ev_n_signals_added)
1904 		evsig_set_base_(base);
1905 
1906 	done = 0;
1907 
1908 #ifndef EVENT__DISABLE_THREAD_SUPPORT
1909 	base->th_owner_id = EVTHREAD_GET_ID();
1910 #endif
1911 
1912 	base->event_gotterm = base->event_break = 0;
1913 
1914 	while (!done) {
1915 		base->event_continue = 0;
1916 		base->n_deferreds_queued = 0;
1917 
1918 		/* Terminate the loop if we have been asked to */
1919 		if (base->event_gotterm) {
1920 			break;
1921 		}
1922 
1923 		if (base->event_break) {
1924 			break;
1925 		}
1926 
1927 		tv_p = &tv;
1928 		if (!N_ACTIVE_CALLBACKS(base) && !(flags & EVLOOP_NONBLOCK)) {
1929 			timeout_next(base, &tv_p);
1930 		} else {
1931 			/*
1932 			 * if we have active events, we just poll new events
1933 			 * without waiting.
1934 			 */
1935 			evutil_timerclear(&tv);
1936 		}
1937 
1938 		/* If we have no events, we just exit */
1939 		if (0==(flags&EVLOOP_NO_EXIT_ON_EMPTY) &&
1940 		    !event_haveevents(base) && !N_ACTIVE_CALLBACKS(base)) {
1941 			event_debug(("%s: no events registered.", __func__));
1942 			retval = 1;
1943 			goto done;
1944 		}
1945 
1946 		event_queue_make_later_events_active(base);
1947 
1948 		clear_time_cache(base);
1949 
1950 		res = evsel->dispatch(base, tv_p);
1951 
1952 		if (res == -1) {
1953 			event_debug(("%s: dispatch returned unsuccessfully.",
1954 				__func__));
1955 			retval = -1;
1956 			goto done;
1957 		}
1958 
1959 		update_time_cache(base);
1960 
1961 		timeout_process(base);
1962 
1963 		if (N_ACTIVE_CALLBACKS(base)) {
1964 			int n = event_process_active(base);
1965 			if ((flags & EVLOOP_ONCE)
1966 			    && N_ACTIVE_CALLBACKS(base) == 0
1967 			    && n != 0)
1968 				done = 1;
1969 		} else if (flags & EVLOOP_NONBLOCK)
1970 			done = 1;
1971 	}
1972 	event_debug(("%s: asked to terminate loop.", __func__));
1973 
1974 done:
1975 	clear_time_cache(base);
1976 	base->running_loop = 0;
1977 
1978 	EVBASE_RELEASE_LOCK(base, th_base_lock);
1979 
1980 	return (retval);
1981 }
1982 
1983 /* One-time callback to implement event_base_once: invokes the user callback,
1984  * then deletes the allocated storage */
1985 static void
1986 event_once_cb(evutil_socket_t fd, short events, void *arg)
1987 {
1988 	struct event_once *eonce = arg;
1989 
1990 	(*eonce->cb)(fd, events, eonce->arg);
1991 	EVBASE_ACQUIRE_LOCK(eonce->ev.ev_base, th_base_lock);
1992 	LIST_REMOVE(eonce, next_once);
1993 	EVBASE_RELEASE_LOCK(eonce->ev.ev_base, th_base_lock);
1994 	event_debug_unassign(&eonce->ev);
1995 	mm_free(eonce);
1996 }
1997 
1998 /* not threadsafe, event scheduled once. */
1999 int
2000 event_once(evutil_socket_t fd, short events,
2001     void (*callback)(evutil_socket_t, short, void *),
2002     void *arg, const struct timeval *tv)
2003 {
2004 	return event_base_once(current_base, fd, events, callback, arg, tv);
2005 }
2006 
2007 /* Schedules an event once */
2008 int
2009 event_base_once(struct event_base *base, evutil_socket_t fd, short events,
2010     void (*callback)(evutil_socket_t, short, void *),
2011     void *arg, const struct timeval *tv)
2012 {
2013 	struct event_once *eonce;
2014 	int res = 0;
2015 	int activate = 0;
2016 
2017 	/* We cannot support signals that just fire once, or persistent
2018 	 * events. */
2019 	if (events & (EV_SIGNAL|EV_PERSIST))
2020 		return (-1);
2021 
2022 	if ((eonce = mm_calloc(1, sizeof(struct event_once))) == NULL)
2023 		return (-1);
2024 
2025 	eonce->cb = callback;
2026 	eonce->arg = arg;
2027 
2028 	if ((events & (EV_TIMEOUT|EV_SIGNAL|EV_READ|EV_WRITE|EV_CLOSED)) == EV_TIMEOUT) {
2029 		evtimer_assign(&eonce->ev, base, event_once_cb, eonce);
2030 
2031 		if (tv == NULL || ! evutil_timerisset(tv)) {
2032 			/* If the event is going to become active immediately,
2033 			 * don't put it on the timeout queue.  This is one
2034 			 * idiom for scheduling a callback, so let's make
2035 			 * it fast (and order-preserving). */
2036 			activate = 1;
2037 		}
2038 	} else if (events & (EV_READ|EV_WRITE|EV_CLOSED)) {
2039 		events &= EV_READ|EV_WRITE|EV_CLOSED;
2040 
2041 		event_assign(&eonce->ev, base, fd, events, event_once_cb, eonce);
2042 	} else {
2043 		/* Bad event combination */
2044 		mm_free(eonce);
2045 		return (-1);
2046 	}
2047 
2048 	if (res == 0) {
2049 		EVBASE_ACQUIRE_LOCK(base, th_base_lock);
2050 		if (activate)
2051 			event_active_nolock_(&eonce->ev, EV_TIMEOUT, 1);
2052 		else
2053 			res = event_add_nolock_(&eonce->ev, tv, 0);
2054 
2055 		if (res != 0) {
2056 			mm_free(eonce);
2057 			return (res);
2058 		} else {
2059 			LIST_INSERT_HEAD(&base->once_events, eonce, next_once);
2060 		}
2061 		EVBASE_RELEASE_LOCK(base, th_base_lock);
2062 	}
2063 
2064 	return (0);
2065 }
2066 
2067 int
2068 event_assign(struct event *ev, struct event_base *base, evutil_socket_t fd, short events, void (*callback)(evutil_socket_t, short, void *), void *arg)
2069 {
2070 	if (!base)
2071 		base = current_base;
2072 	if (arg == &event_self_cbarg_ptr_)
2073 		arg = ev;
2074 
2075 	event_debug_assert_not_added_(ev);
2076 
2077 	ev->ev_base = base;
2078 
2079 	ev->ev_callback = callback;
2080 	ev->ev_arg = arg;
2081 	ev->ev_fd = fd;
2082 	ev->ev_events = events;
2083 	ev->ev_res = 0;
2084 	ev->ev_flags = EVLIST_INIT;
2085 	ev->ev_ncalls = 0;
2086 	ev->ev_pncalls = NULL;
2087 
2088 	if (events & EV_SIGNAL) {
2089 		if ((events & (EV_READ|EV_WRITE|EV_CLOSED)) != 0) {
2090 			event_warnx("%s: EV_SIGNAL is not compatible with "
2091 			    "EV_READ, EV_WRITE or EV_CLOSED", __func__);
2092 			return -1;
2093 		}
2094 		ev->ev_closure = EV_CLOSURE_EVENT_SIGNAL;
2095 	} else {
2096 		if (events & EV_PERSIST) {
2097 			evutil_timerclear(&ev->ev_io_timeout);
2098 			ev->ev_closure = EV_CLOSURE_EVENT_PERSIST;
2099 		} else {
2100 			ev->ev_closure = EV_CLOSURE_EVENT;
2101 		}
2102 	}
2103 
2104 	min_heap_elem_init_(ev);
2105 
2106 	if (base != NULL) {
2107 		/* by default, we put new events into the middle priority */
2108 		ev->ev_pri = base->nactivequeues / 2;
2109 	}
2110 
2111 	event_debug_note_setup_(ev);
2112 
2113 	return 0;
2114 }
2115 
2116 int
2117 event_base_set(struct event_base *base, struct event *ev)
2118 {
2119 	/* Only innocent events may be assigned to a different base */
2120 	if (ev->ev_flags != EVLIST_INIT)
2121 		return (-1);
2122 
2123 	event_debug_assert_is_setup_(ev);
2124 
2125 	ev->ev_base = base;
2126 	ev->ev_pri = base->nactivequeues/2;
2127 
2128 	return (0);
2129 }
2130 
2131 void
2132 event_set(struct event *ev, evutil_socket_t fd, short events,
2133 	  void (*callback)(evutil_socket_t, short, void *), void *arg)
2134 {
2135 	int r;
2136 	r = event_assign(ev, current_base, fd, events, callback, arg);
2137 	EVUTIL_ASSERT(r == 0);
2138 }
2139 
2140 void *
2141 event_self_cbarg(void)
2142 {
2143 	return &event_self_cbarg_ptr_;
2144 }
2145 
2146 struct event *
2147 event_base_get_running_event(struct event_base *base)
2148 {
2149 	struct event *ev = NULL;
2150 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
2151 	if (EVBASE_IN_THREAD(base)) {
2152 		struct event_callback *evcb = base->current_event;
2153 		if (evcb->evcb_flags & EVLIST_INIT)
2154 			ev = event_callback_to_event(evcb);
2155 	}
2156 	EVBASE_RELEASE_LOCK(base, th_base_lock);
2157 	return ev;
2158 }
2159 
2160 struct event *
2161 event_new(struct event_base *base, evutil_socket_t fd, short events, void (*cb)(evutil_socket_t, short, void *), void *arg)
2162 {
2163 	struct event *ev;
2164 	ev = mm_malloc(sizeof(struct event));
2165 	if (ev == NULL)
2166 		return (NULL);
2167 	if (event_assign(ev, base, fd, events, cb, arg) < 0) {
2168 		mm_free(ev);
2169 		return (NULL);
2170 	}
2171 
2172 	return (ev);
2173 }
2174 
2175 void
2176 event_free(struct event *ev)
2177 {
2178 	/* This is disabled, so that events which have been finalized be a
2179 	 * valid target for event_free(). That's */
2180 	// event_debug_assert_is_setup_(ev);
2181 
2182 	/* make sure that this event won't be coming back to haunt us. */
2183 	event_del(ev);
2184 	event_debug_note_teardown_(ev);
2185 	mm_free(ev);
2186 
2187 }
2188 
2189 void
2190 event_debug_unassign(struct event *ev)
2191 {
2192 	event_debug_assert_not_added_(ev);
2193 	event_debug_note_teardown_(ev);
2194 
2195 	ev->ev_flags &= ~EVLIST_INIT;
2196 }
2197 
2198 #define EVENT_FINALIZE_FREE_ 0x10000
2199 static int
2200 event_finalize_nolock_(struct event_base *base, unsigned flags, struct event *ev, event_finalize_callback_fn cb)
2201 {
2202 	ev_uint8_t closure = (flags & EVENT_FINALIZE_FREE_) ?
2203 	    EV_CLOSURE_EVENT_FINALIZE_FREE : EV_CLOSURE_EVENT_FINALIZE;
2204 
2205 	event_del_nolock_(ev, EVENT_DEL_NOBLOCK);
2206 	ev->ev_closure = closure;
2207 	ev->ev_evcallback.evcb_cb_union.evcb_evfinalize = cb;
2208 	event_active_nolock_(ev, EV_FINALIZE, 1);
2209 	ev->ev_flags |= EVLIST_FINALIZING;
2210 	return 0;
2211 }
2212 
2213 static int
2214 event_finalize_impl_(unsigned flags, struct event *ev, event_finalize_callback_fn cb)
2215 {
2216 	int r;
2217 	struct event_base *base = ev->ev_base;
2218 	if (EVUTIL_FAILURE_CHECK(!base)) {
2219 		event_warnx("%s: event has no event_base set.", __func__);
2220 		return -1;
2221 	}
2222 
2223 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
2224 	r = event_finalize_nolock_(base, flags, ev, cb);
2225 	EVBASE_RELEASE_LOCK(base, th_base_lock);
2226 	return r;
2227 }
2228 
2229 int
2230 event_finalize(unsigned flags, struct event *ev, event_finalize_callback_fn cb)
2231 {
2232 	return event_finalize_impl_(flags, ev, cb);
2233 }
2234 
2235 int
2236 event_free_finalize(unsigned flags, struct event *ev, event_finalize_callback_fn cb)
2237 {
2238 	return event_finalize_impl_(flags|EVENT_FINALIZE_FREE_, ev, cb);
2239 }
2240 
2241 void
2242 event_callback_finalize_nolock_(struct event_base *base, unsigned flags, struct event_callback *evcb, void (*cb)(struct event_callback *, void *))
2243 {
2244 	struct event *ev = NULL;
2245 	if (evcb->evcb_flags & EVLIST_INIT) {
2246 		ev = event_callback_to_event(evcb);
2247 		event_del_nolock_(ev, EVENT_DEL_NOBLOCK);
2248 	} else {
2249 		event_callback_cancel_nolock_(base, evcb, 0); /*XXX can this fail?*/
2250 	}
2251 
2252 	evcb->evcb_closure = EV_CLOSURE_CB_FINALIZE;
2253 	evcb->evcb_cb_union.evcb_cbfinalize = cb;
2254 	event_callback_activate_nolock_(base, evcb); /* XXX can this really fail?*/
2255 	evcb->evcb_flags |= EVLIST_FINALIZING;
2256 }
2257 
2258 void
2259 event_callback_finalize_(struct event_base *base, unsigned flags, struct event_callback *evcb, void (*cb)(struct event_callback *, void *))
2260 {
2261 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
2262 	event_callback_finalize_nolock_(base, flags, evcb, cb);
2263 	EVBASE_RELEASE_LOCK(base, th_base_lock);
2264 }
2265 
2266 /** Internal: Finalize all of the n_cbs callbacks in evcbs.  The provided
2267  * callback will be invoked on *one of them*, after they have *all* been
2268  * finalized. */
2269 int
2270 event_callback_finalize_many_(struct event_base *base, int n_cbs, struct event_callback **evcbs, void (*cb)(struct event_callback *, void *))
2271 {
2272 	int n_pending = 0, i;
2273 
2274 	if (base == NULL)
2275 		base = current_base;
2276 
2277 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
2278 
2279 	event_debug(("%s: %d events finalizing", __func__, n_cbs));
2280 
2281 	/* At most one can be currently executing; the rest we just
2282 	 * cancel... But we always make sure that the finalize callback
2283 	 * runs. */
2284 	for (i = 0; i < n_cbs; ++i) {
2285 		struct event_callback *evcb = evcbs[i];
2286 		if (evcb == base->current_event) {
2287 			event_callback_finalize_nolock_(base, 0, evcb, cb);
2288 			++n_pending;
2289 		} else {
2290 			event_callback_cancel_nolock_(base, evcb, 0);
2291 		}
2292 	}
2293 
2294 	if (n_pending == 0) {
2295 		/* Just do the first one. */
2296 		event_callback_finalize_nolock_(base, 0, evcbs[0], cb);
2297 	}
2298 
2299 	EVBASE_RELEASE_LOCK(base, th_base_lock);
2300 	return 0;
2301 }
2302 
2303 /*
2304  * Set's the priority of an event - if an event is already scheduled
2305  * changing the priority is going to fail.
2306  */
2307 
2308 int
2309 event_priority_set(struct event *ev, int pri)
2310 {
2311 	event_debug_assert_is_setup_(ev);
2312 
2313 	if (ev->ev_flags & EVLIST_ACTIVE)
2314 		return (-1);
2315 	if (pri < 0 || pri >= ev->ev_base->nactivequeues)
2316 		return (-1);
2317 
2318 	ev->ev_pri = pri;
2319 
2320 	return (0);
2321 }
2322 
2323 /*
2324  * Checks if a specific event is pending or scheduled.
2325  */
2326 
2327 int
2328 event_pending(const struct event *ev, short event, struct timeval *tv)
2329 {
2330 	int flags = 0;
2331 
2332 	if (EVUTIL_FAILURE_CHECK(ev->ev_base == NULL)) {
2333 		event_warnx("%s: event has no event_base set.", __func__);
2334 		return 0;
2335 	}
2336 
2337 	EVBASE_ACQUIRE_LOCK(ev->ev_base, th_base_lock);
2338 	event_debug_assert_is_setup_(ev);
2339 
2340 	if (ev->ev_flags & EVLIST_INSERTED)
2341 		flags |= (ev->ev_events & (EV_READ|EV_WRITE|EV_CLOSED|EV_SIGNAL));
2342 	if (ev->ev_flags & (EVLIST_ACTIVE|EVLIST_ACTIVE_LATER))
2343 		flags |= ev->ev_res;
2344 	if (ev->ev_flags & EVLIST_TIMEOUT)
2345 		flags |= EV_TIMEOUT;
2346 
2347 	event &= (EV_TIMEOUT|EV_READ|EV_WRITE|EV_CLOSED|EV_SIGNAL);
2348 
2349 	/* See if there is a timeout that we should report */
2350 	if (tv != NULL && (flags & event & EV_TIMEOUT)) {
2351 		struct timeval tmp = ev->ev_timeout;
2352 		tmp.tv_usec &= MICROSECONDS_MASK;
2353 		/* correctly remamp to real time */
2354 		evutil_timeradd(&ev->ev_base->tv_clock_diff, &tmp, tv);
2355 	}
2356 
2357 	EVBASE_RELEASE_LOCK(ev->ev_base, th_base_lock);
2358 
2359 	return (flags & event);
2360 }
2361 
2362 int
2363 event_initialized(const struct event *ev)
2364 {
2365 	if (!(ev->ev_flags & EVLIST_INIT))
2366 		return 0;
2367 
2368 	return 1;
2369 }
2370 
2371 void
2372 event_get_assignment(const struct event *event, struct event_base **base_out, evutil_socket_t *fd_out, short *events_out, event_callback_fn *callback_out, void **arg_out)
2373 {
2374 	event_debug_assert_is_setup_(event);
2375 
2376 	if (base_out)
2377 		*base_out = event->ev_base;
2378 	if (fd_out)
2379 		*fd_out = event->ev_fd;
2380 	if (events_out)
2381 		*events_out = event->ev_events;
2382 	if (callback_out)
2383 		*callback_out = event->ev_callback;
2384 	if (arg_out)
2385 		*arg_out = event->ev_arg;
2386 }
2387 
2388 size_t
2389 event_get_struct_event_size(void)
2390 {
2391 	return sizeof(struct event);
2392 }
2393 
2394 evutil_socket_t
2395 event_get_fd(const struct event *ev)
2396 {
2397 	event_debug_assert_is_setup_(ev);
2398 	return ev->ev_fd;
2399 }
2400 
2401 struct event_base *
2402 event_get_base(const struct event *ev)
2403 {
2404 	event_debug_assert_is_setup_(ev);
2405 	return ev->ev_base;
2406 }
2407 
2408 short
2409 event_get_events(const struct event *ev)
2410 {
2411 	event_debug_assert_is_setup_(ev);
2412 	return ev->ev_events;
2413 }
2414 
2415 event_callback_fn
2416 event_get_callback(const struct event *ev)
2417 {
2418 	event_debug_assert_is_setup_(ev);
2419 	return ev->ev_callback;
2420 }
2421 
2422 void *
2423 event_get_callback_arg(const struct event *ev)
2424 {
2425 	event_debug_assert_is_setup_(ev);
2426 	return ev->ev_arg;
2427 }
2428 
2429 int
2430 event_get_priority(const struct event *ev)
2431 {
2432 	event_debug_assert_is_setup_(ev);
2433 	return ev->ev_pri;
2434 }
2435 
2436 int
2437 event_add(struct event *ev, const struct timeval *tv)
2438 {
2439 	int res;
2440 
2441 	if (EVUTIL_FAILURE_CHECK(!ev->ev_base)) {
2442 		event_warnx("%s: event has no event_base set.", __func__);
2443 		return -1;
2444 	}
2445 
2446 	EVBASE_ACQUIRE_LOCK(ev->ev_base, th_base_lock);
2447 
2448 	res = event_add_nolock_(ev, tv, 0);
2449 
2450 	EVBASE_RELEASE_LOCK(ev->ev_base, th_base_lock);
2451 
2452 	return (res);
2453 }
2454 
2455 /* Helper callback: wake an event_base from another thread.  This version
2456  * works by writing a byte to one end of a socketpair, so that the event_base
2457  * listening on the other end will wake up as the corresponding event
2458  * triggers */
2459 static int
2460 evthread_notify_base_default(struct event_base *base)
2461 {
2462 	char buf[1];
2463 	int r;
2464 	buf[0] = (char) 0;
2465 #ifdef _WIN32
2466 	r = send(base->th_notify_fd[1], buf, 1, 0);
2467 #else
2468 	r = write(base->th_notify_fd[1], buf, 1);
2469 #endif
2470 	return (r < 0 && ! EVUTIL_ERR_IS_EAGAIN(errno)) ? -1 : 0;
2471 }
2472 
2473 #ifdef EVENT__HAVE_EVENTFD
2474 /* Helper callback: wake an event_base from another thread.  This version
2475  * assumes that you have a working eventfd() implementation. */
2476 static int
2477 evthread_notify_base_eventfd(struct event_base *base)
2478 {
2479 	ev_uint64_t msg = 1;
2480 	int r;
2481 	do {
2482 		r = write(base->th_notify_fd[0], (void*) &msg, sizeof(msg));
2483 	} while (r < 0 && errno == EAGAIN);
2484 
2485 	return (r < 0) ? -1 : 0;
2486 }
2487 #endif
2488 
2489 
2490 /** Tell the thread currently running the event_loop for base (if any) that it
2491  * needs to stop waiting in its dispatch function (if it is) and process all
2492  * active callbacks. */
2493 static int
2494 evthread_notify_base(struct event_base *base)
2495 {
2496 	EVENT_BASE_ASSERT_LOCKED(base);
2497 	if (!base->th_notify_fn)
2498 		return -1;
2499 	if (base->is_notify_pending)
2500 		return 0;
2501 	base->is_notify_pending = 1;
2502 	return base->th_notify_fn(base);
2503 }
2504 
2505 /* Implementation function to remove a timeout on a currently pending event.
2506  */
2507 int
2508 event_remove_timer_nolock_(struct event *ev)
2509 {
2510 	struct event_base *base = ev->ev_base;
2511 
2512 	EVENT_BASE_ASSERT_LOCKED(base);
2513 	event_debug_assert_is_setup_(ev);
2514 
2515 	event_debug(("event_remove_timer_nolock: event: %p", ev));
2516 
2517 	/* If it's not pending on a timeout, we don't need to do anything. */
2518 	if (ev->ev_flags & EVLIST_TIMEOUT) {
2519 		event_queue_remove_timeout(base, ev);
2520 		evutil_timerclear(&ev->ev_.ev_io.ev_timeout);
2521 	}
2522 
2523 	return (0);
2524 }
2525 
2526 int
2527 event_remove_timer(struct event *ev)
2528 {
2529 	int res;
2530 
2531 	if (EVUTIL_FAILURE_CHECK(!ev->ev_base)) {
2532 		event_warnx("%s: event has no event_base set.", __func__);
2533 		return -1;
2534 	}
2535 
2536 	EVBASE_ACQUIRE_LOCK(ev->ev_base, th_base_lock);
2537 
2538 	res = event_remove_timer_nolock_(ev);
2539 
2540 	EVBASE_RELEASE_LOCK(ev->ev_base, th_base_lock);
2541 
2542 	return (res);
2543 }
2544 
2545 /* Implementation function to add an event.  Works just like event_add,
2546  * except: 1) it requires that we have the lock.  2) if tv_is_absolute is set,
2547  * we treat tv as an absolute time, not as an interval to add to the current
2548  * time */
2549 int
2550 event_add_nolock_(struct event *ev, const struct timeval *tv,
2551     int tv_is_absolute)
2552 {
2553 	struct event_base *base = ev->ev_base;
2554 	int res = 0;
2555 	int notify = 0;
2556 
2557 	EVENT_BASE_ASSERT_LOCKED(base);
2558 	event_debug_assert_is_setup_(ev);
2559 
2560 	event_debug((
2561 		 "event_add: event: %p (fd "EV_SOCK_FMT"), %s%s%s%scall %p",
2562 		 ev,
2563 		 EV_SOCK_ARG(ev->ev_fd),
2564 		 ev->ev_events & EV_READ ? "EV_READ " : " ",
2565 		 ev->ev_events & EV_WRITE ? "EV_WRITE " : " ",
2566 		 ev->ev_events & EV_CLOSED ? "EV_CLOSED " : " ",
2567 		 tv ? "EV_TIMEOUT " : " ",
2568 		 ev->ev_callback));
2569 
2570 	EVUTIL_ASSERT(!(ev->ev_flags & ~EVLIST_ALL));
2571 
2572 	if (ev->ev_flags & EVLIST_FINALIZING) {
2573 		/* XXXX debug */
2574 		return (-1);
2575 	}
2576 
2577 	/*
2578 	 * prepare for timeout insertion further below, if we get a
2579 	 * failure on any step, we should not change any state.
2580 	 */
2581 	if (tv != NULL && !(ev->ev_flags & EVLIST_TIMEOUT)) {
2582 		if (min_heap_reserve_(&base->timeheap,
2583 			1 + min_heap_size_(&base->timeheap)) == -1)
2584 			return (-1);  /* ENOMEM == errno */
2585 	}
2586 
2587 	/* If the main thread is currently executing a signal event's
2588 	 * callback, and we are not the main thread, then we want to wait
2589 	 * until the callback is done before we mess with the event, or else
2590 	 * we can race on ev_ncalls and ev_pncalls below. */
2591 #ifndef EVENT__DISABLE_THREAD_SUPPORT
2592 	if (base->current_event == event_to_event_callback(ev) &&
2593 	    (ev->ev_events & EV_SIGNAL)
2594 	    && !EVBASE_IN_THREAD(base)) {
2595 		++base->current_event_waiters;
2596 		EVTHREAD_COND_WAIT(base->current_event_cond, base->th_base_lock);
2597 	}
2598 #endif
2599 
2600 	if ((ev->ev_events & (EV_READ|EV_WRITE|EV_CLOSED|EV_SIGNAL)) &&
2601 	    !(ev->ev_flags & (EVLIST_INSERTED|EVLIST_ACTIVE|EVLIST_ACTIVE_LATER))) {
2602 		if (ev->ev_events & (EV_READ|EV_WRITE|EV_CLOSED))
2603 			res = evmap_io_add_(base, ev->ev_fd, ev);
2604 		else if (ev->ev_events & EV_SIGNAL)
2605 			res = evmap_signal_add_(base, (int)ev->ev_fd, ev);
2606 		if (res != -1)
2607 			event_queue_insert_inserted(base, ev);
2608 		if (res == 1) {
2609 			/* evmap says we need to notify the main thread. */
2610 			notify = 1;
2611 			res = 0;
2612 		}
2613 	}
2614 
2615 	/*
2616 	 * we should change the timeout state only if the previous event
2617 	 * addition succeeded.
2618 	 */
2619 	if (res != -1 && tv != NULL) {
2620 		struct timeval now;
2621 		int common_timeout;
2622 #ifdef USE_REINSERT_TIMEOUT
2623 		int was_common;
2624 		int old_timeout_idx;
2625 #endif
2626 
2627 		/*
2628 		 * for persistent timeout events, we remember the
2629 		 * timeout value and re-add the event.
2630 		 *
2631 		 * If tv_is_absolute, this was already set.
2632 		 */
2633 		if (ev->ev_closure == EV_CLOSURE_EVENT_PERSIST && !tv_is_absolute)
2634 			ev->ev_io_timeout = *tv;
2635 
2636 #ifndef USE_REINSERT_TIMEOUT
2637 		if (ev->ev_flags & EVLIST_TIMEOUT) {
2638 			event_queue_remove_timeout(base, ev);
2639 		}
2640 #endif
2641 
2642 		/* Check if it is active due to a timeout.  Rescheduling
2643 		 * this timeout before the callback can be executed
2644 		 * removes it from the active list. */
2645 		if ((ev->ev_flags & EVLIST_ACTIVE) &&
2646 		    (ev->ev_res & EV_TIMEOUT)) {
2647 			if (ev->ev_events & EV_SIGNAL) {
2648 				/* See if we are just active executing
2649 				 * this event in a loop
2650 				 */
2651 				if (ev->ev_ncalls && ev->ev_pncalls) {
2652 					/* Abort loop */
2653 					*ev->ev_pncalls = 0;
2654 				}
2655 			}
2656 
2657 			event_queue_remove_active(base, event_to_event_callback(ev));
2658 		}
2659 
2660 		gettime(base, &now);
2661 
2662 		common_timeout = is_common_timeout(tv, base);
2663 #ifdef USE_REINSERT_TIMEOUT
2664 		was_common = is_common_timeout(&ev->ev_timeout, base);
2665 		old_timeout_idx = COMMON_TIMEOUT_IDX(&ev->ev_timeout);
2666 #endif
2667 
2668 		if (tv_is_absolute) {
2669 			ev->ev_timeout = *tv;
2670 		} else if (common_timeout) {
2671 			struct timeval tmp = *tv;
2672 			tmp.tv_usec &= MICROSECONDS_MASK;
2673 			evutil_timeradd(&now, &tmp, &ev->ev_timeout);
2674 			ev->ev_timeout.tv_usec |=
2675 			    (tv->tv_usec & ~MICROSECONDS_MASK);
2676 		} else {
2677 			evutil_timeradd(&now, tv, &ev->ev_timeout);
2678 		}
2679 
2680 		event_debug((
2681 			 "event_add: event %p, timeout in %d seconds %d useconds, call %p",
2682 			 ev, (int)tv->tv_sec, (int)tv->tv_usec, ev->ev_callback));
2683 
2684 #ifdef USE_REINSERT_TIMEOUT
2685 		event_queue_reinsert_timeout(base, ev, was_common, common_timeout, old_timeout_idx);
2686 #else
2687 		event_queue_insert_timeout(base, ev);
2688 #endif
2689 
2690 		if (common_timeout) {
2691 			struct common_timeout_list *ctl =
2692 			    get_common_timeout_list(base, &ev->ev_timeout);
2693 			if (ev == TAILQ_FIRST(&ctl->events)) {
2694 				common_timeout_schedule(ctl, &now, ev);
2695 			}
2696 		} else {
2697 			struct event* top = NULL;
2698 			/* See if the earliest timeout is now earlier than it
2699 			 * was before: if so, we will need to tell the main
2700 			 * thread to wake up earlier than it would otherwise.
2701 			 * We double check the timeout of the top element to
2702 			 * handle time distortions due to system suspension.
2703 			 */
2704 			if (min_heap_elt_is_top_(ev))
2705 				notify = 1;
2706 			else if ((top = min_heap_top_(&base->timeheap)) != NULL &&
2707 					 evutil_timercmp(&top->ev_timeout, &now, <))
2708 				notify = 1;
2709 		}
2710 	}
2711 
2712 	/* if we are not in the right thread, we need to wake up the loop */
2713 	if (res != -1 && notify && EVBASE_NEED_NOTIFY(base))
2714 		evthread_notify_base(base);
2715 
2716 	event_debug_note_add_(ev);
2717 
2718 	return (res);
2719 }
2720 
2721 static int
2722 event_del_(struct event *ev, int blocking)
2723 {
2724 	int res;
2725 
2726 	if (EVUTIL_FAILURE_CHECK(!ev->ev_base)) {
2727 		event_warnx("%s: event has no event_base set.", __func__);
2728 		return -1;
2729 	}
2730 
2731 	EVBASE_ACQUIRE_LOCK(ev->ev_base, th_base_lock);
2732 
2733 	res = event_del_nolock_(ev, blocking);
2734 
2735 	EVBASE_RELEASE_LOCK(ev->ev_base, th_base_lock);
2736 
2737 	return (res);
2738 }
2739 
2740 int
2741 event_del(struct event *ev)
2742 {
2743 	return event_del_(ev, EVENT_DEL_AUTOBLOCK);
2744 }
2745 
2746 int
2747 event_del_block(struct event *ev)
2748 {
2749 	return event_del_(ev, EVENT_DEL_BLOCK);
2750 }
2751 
2752 int
2753 event_del_noblock(struct event *ev)
2754 {
2755 	return event_del_(ev, EVENT_DEL_NOBLOCK);
2756 }
2757 
2758 /** Helper for event_del: always called with th_base_lock held.
2759  *
2760  * "blocking" must be one of the EVENT_DEL_{BLOCK, NOBLOCK, AUTOBLOCK,
2761  * EVEN_IF_FINALIZING} values. See those for more information.
2762  */
2763 int
2764 event_del_nolock_(struct event *ev, int blocking)
2765 {
2766 	struct event_base *base;
2767 	int res = 0, notify = 0;
2768 
2769 	event_debug(("event_del: %p (fd "EV_SOCK_FMT"), callback %p",
2770 		ev, EV_SOCK_ARG(ev->ev_fd), ev->ev_callback));
2771 
2772 	/* An event without a base has not been added */
2773 	if (ev->ev_base == NULL)
2774 		return (-1);
2775 
2776 	EVENT_BASE_ASSERT_LOCKED(ev->ev_base);
2777 
2778 	if (blocking != EVENT_DEL_EVEN_IF_FINALIZING) {
2779 		if (ev->ev_flags & EVLIST_FINALIZING) {
2780 			/* XXXX Debug */
2781 			return 0;
2782 		}
2783 	}
2784 
2785 	/* If the main thread is currently executing this event's callback,
2786 	 * and we are not the main thread, then we want to wait until the
2787 	 * callback is done before we start removing the event.  That way,
2788 	 * when this function returns, it will be safe to free the
2789 	 * user-supplied argument. */
2790 	base = ev->ev_base;
2791 #ifndef EVENT__DISABLE_THREAD_SUPPORT
2792 	if (blocking != EVENT_DEL_NOBLOCK &&
2793 	    base->current_event == event_to_event_callback(ev) &&
2794 	    !EVBASE_IN_THREAD(base) &&
2795 	    (blocking == EVENT_DEL_BLOCK || !(ev->ev_events & EV_FINALIZE))) {
2796 		++base->current_event_waiters;
2797 		EVTHREAD_COND_WAIT(base->current_event_cond, base->th_base_lock);
2798 	}
2799 #endif
2800 
2801 	EVUTIL_ASSERT(!(ev->ev_flags & ~EVLIST_ALL));
2802 
2803 	/* See if we are just active executing this event in a loop */
2804 	if (ev->ev_events & EV_SIGNAL) {
2805 		if (ev->ev_ncalls && ev->ev_pncalls) {
2806 			/* Abort loop */
2807 			*ev->ev_pncalls = 0;
2808 		}
2809 	}
2810 
2811 	if (ev->ev_flags & EVLIST_TIMEOUT) {
2812 		/* NOTE: We never need to notify the main thread because of a
2813 		 * deleted timeout event: all that could happen if we don't is
2814 		 * that the dispatch loop might wake up too early.  But the
2815 		 * point of notifying the main thread _is_ to wake up the
2816 		 * dispatch loop early anyway, so we wouldn't gain anything by
2817 		 * doing it.
2818 		 */
2819 		event_queue_remove_timeout(base, ev);
2820 	}
2821 
2822 	if (ev->ev_flags & EVLIST_ACTIVE)
2823 		event_queue_remove_active(base, event_to_event_callback(ev));
2824 	else if (ev->ev_flags & EVLIST_ACTIVE_LATER)
2825 		event_queue_remove_active_later(base, event_to_event_callback(ev));
2826 
2827 	if (ev->ev_flags & EVLIST_INSERTED) {
2828 		event_queue_remove_inserted(base, ev);
2829 		if (ev->ev_events & (EV_READ|EV_WRITE|EV_CLOSED))
2830 			res = evmap_io_del_(base, ev->ev_fd, ev);
2831 		else
2832 			res = evmap_signal_del_(base, (int)ev->ev_fd, ev);
2833 		if (res == 1) {
2834 			/* evmap says we need to notify the main thread. */
2835 			notify = 1;
2836 			res = 0;
2837 		}
2838 	}
2839 
2840 	/* if we are not in the right thread, we need to wake up the loop */
2841 	if (res != -1 && notify && EVBASE_NEED_NOTIFY(base))
2842 		evthread_notify_base(base);
2843 
2844 	event_debug_note_del_(ev);
2845 
2846 	return (res);
2847 }
2848 
2849 void
2850 event_active(struct event *ev, int res, short ncalls)
2851 {
2852 	if (EVUTIL_FAILURE_CHECK(!ev->ev_base)) {
2853 		event_warnx("%s: event has no event_base set.", __func__);
2854 		return;
2855 	}
2856 
2857 	EVBASE_ACQUIRE_LOCK(ev->ev_base, th_base_lock);
2858 
2859 	event_debug_assert_is_setup_(ev);
2860 
2861 	event_active_nolock_(ev, res, ncalls);
2862 
2863 	EVBASE_RELEASE_LOCK(ev->ev_base, th_base_lock);
2864 }
2865 
2866 
2867 void
2868 event_active_nolock_(struct event *ev, int res, short ncalls)
2869 {
2870 	struct event_base *base;
2871 
2872 	event_debug(("event_active: %p (fd "EV_SOCK_FMT"), res %d, callback %p",
2873 		ev, EV_SOCK_ARG(ev->ev_fd), (int)res, ev->ev_callback));
2874 
2875 	base = ev->ev_base;
2876 	EVENT_BASE_ASSERT_LOCKED(base);
2877 
2878 	if (ev->ev_flags & EVLIST_FINALIZING) {
2879 		/* XXXX debug */
2880 		return;
2881 	}
2882 
2883 	switch ((ev->ev_flags & (EVLIST_ACTIVE|EVLIST_ACTIVE_LATER))) {
2884 	default:
2885 	case EVLIST_ACTIVE|EVLIST_ACTIVE_LATER:
2886 		EVUTIL_ASSERT(0);
2887 		break;
2888 	case EVLIST_ACTIVE:
2889 		/* We get different kinds of events, add them together */
2890 		ev->ev_res |= res;
2891 		return;
2892 	case EVLIST_ACTIVE_LATER:
2893 		ev->ev_res |= res;
2894 		break;
2895 	case 0:
2896 		ev->ev_res = res;
2897 		break;
2898 	}
2899 
2900 	if (ev->ev_pri < base->event_running_priority)
2901 		base->event_continue = 1;
2902 
2903 	if (ev->ev_events & EV_SIGNAL) {
2904 #ifndef EVENT__DISABLE_THREAD_SUPPORT
2905 		if (base->current_event == event_to_event_callback(ev) &&
2906 		    !EVBASE_IN_THREAD(base)) {
2907 			++base->current_event_waiters;
2908 			EVTHREAD_COND_WAIT(base->current_event_cond, base->th_base_lock);
2909 		}
2910 #endif
2911 		ev->ev_ncalls = ncalls;
2912 		ev->ev_pncalls = NULL;
2913 	}
2914 
2915 	event_callback_activate_nolock_(base, event_to_event_callback(ev));
2916 }
2917 
2918 void
2919 event_active_later_(struct event *ev, int res)
2920 {
2921 	EVBASE_ACQUIRE_LOCK(ev->ev_base, th_base_lock);
2922 	event_active_later_nolock_(ev, res);
2923 	EVBASE_RELEASE_LOCK(ev->ev_base, th_base_lock);
2924 }
2925 
2926 void
2927 event_active_later_nolock_(struct event *ev, int res)
2928 {
2929 	struct event_base *base = ev->ev_base;
2930 	EVENT_BASE_ASSERT_LOCKED(base);
2931 
2932 	if (ev->ev_flags & (EVLIST_ACTIVE|EVLIST_ACTIVE_LATER)) {
2933 		/* We get different kinds of events, add them together */
2934 		ev->ev_res |= res;
2935 		return;
2936 	}
2937 
2938 	ev->ev_res = res;
2939 
2940 	event_callback_activate_later_nolock_(base, event_to_event_callback(ev));
2941 }
2942 
2943 int
2944 event_callback_activate_(struct event_base *base,
2945     struct event_callback *evcb)
2946 {
2947 	int r;
2948 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
2949 	r = event_callback_activate_nolock_(base, evcb);
2950 	EVBASE_RELEASE_LOCK(base, th_base_lock);
2951 	return r;
2952 }
2953 
2954 int
2955 event_callback_activate_nolock_(struct event_base *base,
2956     struct event_callback *evcb)
2957 {
2958 	int r = 1;
2959 
2960 	if (evcb->evcb_flags & EVLIST_FINALIZING)
2961 		return 0;
2962 
2963 	switch (evcb->evcb_flags & (EVLIST_ACTIVE|EVLIST_ACTIVE_LATER)) {
2964 	default:
2965 		EVUTIL_ASSERT(0);
2966 	case EVLIST_ACTIVE_LATER:
2967 		event_queue_remove_active_later(base, evcb);
2968 		r = 0;
2969 		break;
2970 	case EVLIST_ACTIVE:
2971 		return 0;
2972 	case 0:
2973 		break;
2974 	}
2975 
2976 	event_queue_insert_active(base, evcb);
2977 
2978 	if (EVBASE_NEED_NOTIFY(base))
2979 		evthread_notify_base(base);
2980 
2981 	return r;
2982 }
2983 
2984 int
2985 event_callback_activate_later_nolock_(struct event_base *base,
2986     struct event_callback *evcb)
2987 {
2988 	if (evcb->evcb_flags & (EVLIST_ACTIVE|EVLIST_ACTIVE_LATER))
2989 		return 0;
2990 
2991 	event_queue_insert_active_later(base, evcb);
2992 	if (EVBASE_NEED_NOTIFY(base))
2993 		evthread_notify_base(base);
2994 	return 1;
2995 }
2996 
2997 void
2998 event_callback_init_(struct event_base *base,
2999     struct event_callback *cb)
3000 {
3001 	memset(cb, 0, sizeof(*cb));
3002 	cb->evcb_pri = base->nactivequeues - 1;
3003 }
3004 
3005 int
3006 event_callback_cancel_(struct event_base *base,
3007     struct event_callback *evcb)
3008 {
3009 	int r;
3010 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
3011 	r = event_callback_cancel_nolock_(base, evcb, 0);
3012 	EVBASE_RELEASE_LOCK(base, th_base_lock);
3013 	return r;
3014 }
3015 
3016 int
3017 event_callback_cancel_nolock_(struct event_base *base,
3018     struct event_callback *evcb, int even_if_finalizing)
3019 {
3020 	if ((evcb->evcb_flags & EVLIST_FINALIZING) && !even_if_finalizing)
3021 		return 0;
3022 
3023 	if (evcb->evcb_flags & EVLIST_INIT)
3024 		return event_del_nolock_(event_callback_to_event(evcb),
3025 		    even_if_finalizing ? EVENT_DEL_EVEN_IF_FINALIZING : EVENT_DEL_AUTOBLOCK);
3026 
3027 	switch ((evcb->evcb_flags & (EVLIST_ACTIVE|EVLIST_ACTIVE_LATER))) {
3028 	default:
3029 	case EVLIST_ACTIVE|EVLIST_ACTIVE_LATER:
3030 		EVUTIL_ASSERT(0);
3031 		break;
3032 	case EVLIST_ACTIVE:
3033 		/* We get different kinds of events, add them together */
3034 		event_queue_remove_active(base, evcb);
3035 		return 0;
3036 	case EVLIST_ACTIVE_LATER:
3037 		event_queue_remove_active_later(base, evcb);
3038 		break;
3039 	case 0:
3040 		break;
3041 	}
3042 
3043 	return 0;
3044 }
3045 
3046 void
3047 event_deferred_cb_init_(struct event_callback *cb, ev_uint8_t priority, deferred_cb_fn fn, void *arg)
3048 {
3049 	memset(cb, 0, sizeof(*cb));
3050 	cb->evcb_cb_union.evcb_selfcb = fn;
3051 	cb->evcb_arg = arg;
3052 	cb->evcb_pri = priority;
3053 	cb->evcb_closure = EV_CLOSURE_CB_SELF;
3054 }
3055 
3056 void
3057 event_deferred_cb_set_priority_(struct event_callback *cb, ev_uint8_t priority)
3058 {
3059 	cb->evcb_pri = priority;
3060 }
3061 
3062 void
3063 event_deferred_cb_cancel_(struct event_base *base, struct event_callback *cb)
3064 {
3065 	if (!base)
3066 		base = current_base;
3067 	event_callback_cancel_(base, cb);
3068 }
3069 
3070 #define MAX_DEFERREDS_QUEUED 32
3071 int
3072 event_deferred_cb_schedule_(struct event_base *base, struct event_callback *cb)
3073 {
3074 	int r = 1;
3075 	if (!base)
3076 		base = current_base;
3077 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
3078 	if (base->n_deferreds_queued > MAX_DEFERREDS_QUEUED) {
3079 		r = event_callback_activate_later_nolock_(base, cb);
3080 	} else {
3081 		r = event_callback_activate_nolock_(base, cb);
3082 		if (r) {
3083 			++base->n_deferreds_queued;
3084 		}
3085 	}
3086 	EVBASE_RELEASE_LOCK(base, th_base_lock);
3087 	return r;
3088 }
3089 
3090 static int
3091 timeout_next(struct event_base *base, struct timeval **tv_p)
3092 {
3093 	/* Caller must hold th_base_lock */
3094 	struct timeval now;
3095 	struct event *ev;
3096 	struct timeval *tv = *tv_p;
3097 	int res = 0;
3098 
3099 	ev = min_heap_top_(&base->timeheap);
3100 
3101 	if (ev == NULL) {
3102 		/* if no time-based events are active wait for I/O */
3103 		*tv_p = NULL;
3104 		goto out;
3105 	}
3106 
3107 	if (gettime(base, &now) == -1) {
3108 		res = -1;
3109 		goto out;
3110 	}
3111 
3112 	if (evutil_timercmp(&ev->ev_timeout, &now, <=)) {
3113 		evutil_timerclear(tv);
3114 		goto out;
3115 	}
3116 
3117 	evutil_timersub(&ev->ev_timeout, &now, tv);
3118 
3119 	EVUTIL_ASSERT(tv->tv_sec >= 0);
3120 	EVUTIL_ASSERT(tv->tv_usec >= 0);
3121 	event_debug(("timeout_next: event: %p, in %d seconds, %d useconds", ev, (int)tv->tv_sec, (int)tv->tv_usec));
3122 
3123 out:
3124 	return (res);
3125 }
3126 
3127 /* Activate every event whose timeout has elapsed. */
3128 static void
3129 timeout_process(struct event_base *base)
3130 {
3131 	/* Caller must hold lock. */
3132 	struct timeval now;
3133 	struct event *ev;
3134 
3135 	if (min_heap_empty_(&base->timeheap)) {
3136 		return;
3137 	}
3138 
3139 	gettime(base, &now);
3140 
3141 	while ((ev = min_heap_top_(&base->timeheap))) {
3142 		if (evutil_timercmp(&ev->ev_timeout, &now, >))
3143 			break;
3144 
3145 		/* delete this event from the I/O queues */
3146 		event_del_nolock_(ev, EVENT_DEL_NOBLOCK);
3147 
3148 		event_debug(("timeout_process: event: %p, call %p",
3149 			 ev, ev->ev_callback));
3150 		event_active_nolock_(ev, EV_TIMEOUT, 1);
3151 	}
3152 }
3153 
3154 #if (EVLIST_INTERNAL >> 4) != 1
3155 #error "Mismatch for value of EVLIST_INTERNAL"
3156 #endif
3157 
3158 #ifndef MAX
3159 #define MAX(a,b) (((a)>(b))?(a):(b))
3160 #endif
3161 
3162 #define MAX_EVENT_COUNT(var, v) var = MAX(var, v)
3163 
3164 /* These are a fancy way to spell
3165      if (flags & EVLIST_INTERNAL)
3166          base->event_count--/++;
3167 */
3168 #define DECR_EVENT_COUNT(base,flags) \
3169 	((base)->event_count -= (~((flags) >> 4) & 1))
3170 #define INCR_EVENT_COUNT(base,flags) do {					\
3171 	((base)->event_count += (~((flags) >> 4) & 1));				\
3172 	MAX_EVENT_COUNT((base)->event_count_max, (base)->event_count);		\
3173 } while (0)
3174 
3175 static void
3176 event_queue_remove_inserted(struct event_base *base, struct event *ev)
3177 {
3178 	EVENT_BASE_ASSERT_LOCKED(base);
3179 	if (EVUTIL_FAILURE_CHECK(!(ev->ev_flags & EVLIST_INSERTED))) {
3180 		event_errx(1, "%s: %p(fd "EV_SOCK_FMT") not on queue %x", __func__,
3181 		    ev, EV_SOCK_ARG(ev->ev_fd), EVLIST_INSERTED);
3182 		return;
3183 	}
3184 	DECR_EVENT_COUNT(base, ev->ev_flags);
3185 	ev->ev_flags &= ~EVLIST_INSERTED;
3186 }
3187 static void
3188 event_queue_remove_active(struct event_base *base, struct event_callback *evcb)
3189 {
3190 	EVENT_BASE_ASSERT_LOCKED(base);
3191 	if (EVUTIL_FAILURE_CHECK(!(evcb->evcb_flags & EVLIST_ACTIVE))) {
3192 		event_errx(1, "%s: %p not on queue %x", __func__,
3193 			   evcb, EVLIST_ACTIVE);
3194 		return;
3195 	}
3196 	DECR_EVENT_COUNT(base, evcb->evcb_flags);
3197 	evcb->evcb_flags &= ~EVLIST_ACTIVE;
3198 	base->event_count_active--;
3199 
3200 	TAILQ_REMOVE(&base->activequeues[evcb->evcb_pri],
3201 	    evcb, evcb_active_next);
3202 }
3203 static void
3204 event_queue_remove_active_later(struct event_base *base, struct event_callback *evcb)
3205 {
3206 	EVENT_BASE_ASSERT_LOCKED(base);
3207 	if (EVUTIL_FAILURE_CHECK(!(evcb->evcb_flags & EVLIST_ACTIVE_LATER))) {
3208 		event_errx(1, "%s: %p not on queue %x", __func__,
3209 			   evcb, EVLIST_ACTIVE_LATER);
3210 		return;
3211 	}
3212 	DECR_EVENT_COUNT(base, evcb->evcb_flags);
3213 	evcb->evcb_flags &= ~EVLIST_ACTIVE_LATER;
3214 	base->event_count_active--;
3215 
3216 	TAILQ_REMOVE(&base->active_later_queue, evcb, evcb_active_next);
3217 }
3218 static void
3219 event_queue_remove_timeout(struct event_base *base, struct event *ev)
3220 {
3221 	EVENT_BASE_ASSERT_LOCKED(base);
3222 	if (EVUTIL_FAILURE_CHECK(!(ev->ev_flags & EVLIST_TIMEOUT))) {
3223 		event_errx(1, "%s: %p(fd "EV_SOCK_FMT") not on queue %x", __func__,
3224 		    ev, EV_SOCK_ARG(ev->ev_fd), EVLIST_TIMEOUT);
3225 		return;
3226 	}
3227 	DECR_EVENT_COUNT(base, ev->ev_flags);
3228 	ev->ev_flags &= ~EVLIST_TIMEOUT;
3229 
3230 	if (is_common_timeout(&ev->ev_timeout, base)) {
3231 		struct common_timeout_list *ctl =
3232 		    get_common_timeout_list(base, &ev->ev_timeout);
3233 		TAILQ_REMOVE(&ctl->events, ev,
3234 		    ev_timeout_pos.ev_next_with_common_timeout);
3235 	} else {
3236 		min_heap_erase_(&base->timeheap, ev);
3237 	}
3238 }
3239 
3240 #ifdef USE_REINSERT_TIMEOUT
3241 /* Remove and reinsert 'ev' into the timeout queue. */
3242 static void
3243 event_queue_reinsert_timeout(struct event_base *base, struct event *ev,
3244     int was_common, int is_common, int old_timeout_idx)
3245 {
3246 	struct common_timeout_list *ctl;
3247 	if (!(ev->ev_flags & EVLIST_TIMEOUT)) {
3248 		event_queue_insert_timeout(base, ev);
3249 		return;
3250 	}
3251 
3252 	switch ((was_common<<1) | is_common) {
3253 	case 3: /* Changing from one common timeout to another */
3254 		ctl = base->common_timeout_queues[old_timeout_idx];
3255 		TAILQ_REMOVE(&ctl->events, ev,
3256 		    ev_timeout_pos.ev_next_with_common_timeout);
3257 		ctl = get_common_timeout_list(base, &ev->ev_timeout);
3258 		insert_common_timeout_inorder(ctl, ev);
3259 		break;
3260 	case 2: /* Was common; is no longer common */
3261 		ctl = base->common_timeout_queues[old_timeout_idx];
3262 		TAILQ_REMOVE(&ctl->events, ev,
3263 		    ev_timeout_pos.ev_next_with_common_timeout);
3264 		min_heap_push_(&base->timeheap, ev);
3265 		break;
3266 	case 1: /* Wasn't common; has become common. */
3267 		min_heap_erase_(&base->timeheap, ev);
3268 		ctl = get_common_timeout_list(base, &ev->ev_timeout);
3269 		insert_common_timeout_inorder(ctl, ev);
3270 		break;
3271 	case 0: /* was in heap; is still on heap. */
3272 		min_heap_adjust_(&base->timeheap, ev);
3273 		break;
3274 	default:
3275 		EVUTIL_ASSERT(0); /* unreachable */
3276 		break;
3277 	}
3278 }
3279 #endif
3280 
3281 /* Add 'ev' to the common timeout list in 'ev'. */
3282 static void
3283 insert_common_timeout_inorder(struct common_timeout_list *ctl,
3284     struct event *ev)
3285 {
3286 	struct event *e;
3287 	/* By all logic, we should just be able to append 'ev' to the end of
3288 	 * ctl->events, since the timeout on each 'ev' is set to {the common
3289 	 * timeout} + {the time when we add the event}, and so the events
3290 	 * should arrive in order of their timeeouts.  But just in case
3291 	 * there's some wacky threading issue going on, we do a search from
3292 	 * the end of 'ev' to find the right insertion point.
3293 	 */
3294 	TAILQ_FOREACH_REVERSE(e, &ctl->events,
3295 	    event_list, ev_timeout_pos.ev_next_with_common_timeout) {
3296 		/* This timercmp is a little sneaky, since both ev and e have
3297 		 * magic values in tv_usec.  Fortunately, they ought to have
3298 		 * the _same_ magic values in tv_usec.  Let's assert for that.
3299 		 */
3300 		EVUTIL_ASSERT(
3301 			is_same_common_timeout(&e->ev_timeout, &ev->ev_timeout));
3302 		if (evutil_timercmp(&ev->ev_timeout, &e->ev_timeout, >=)) {
3303 			TAILQ_INSERT_AFTER(&ctl->events, e, ev,
3304 			    ev_timeout_pos.ev_next_with_common_timeout);
3305 			return;
3306 		}
3307 	}
3308 	TAILQ_INSERT_HEAD(&ctl->events, ev,
3309 	    ev_timeout_pos.ev_next_with_common_timeout);
3310 }
3311 
3312 static void
3313 event_queue_insert_inserted(struct event_base *base, struct event *ev)
3314 {
3315 	EVENT_BASE_ASSERT_LOCKED(base);
3316 
3317 	if (EVUTIL_FAILURE_CHECK(ev->ev_flags & EVLIST_INSERTED)) {
3318 		event_errx(1, "%s: %p(fd "EV_SOCK_FMT") already inserted", __func__,
3319 		    ev, EV_SOCK_ARG(ev->ev_fd));
3320 		return;
3321 	}
3322 
3323 	INCR_EVENT_COUNT(base, ev->ev_flags);
3324 
3325 	ev->ev_flags |= EVLIST_INSERTED;
3326 }
3327 
3328 static void
3329 event_queue_insert_active(struct event_base *base, struct event_callback *evcb)
3330 {
3331 	EVENT_BASE_ASSERT_LOCKED(base);
3332 
3333 	if (evcb->evcb_flags & EVLIST_ACTIVE) {
3334 		/* Double insertion is possible for active events */
3335 		return;
3336 	}
3337 
3338 	INCR_EVENT_COUNT(base, evcb->evcb_flags);
3339 
3340 	evcb->evcb_flags |= EVLIST_ACTIVE;
3341 
3342 	base->event_count_active++;
3343 	MAX_EVENT_COUNT(base->event_count_active_max, base->event_count_active);
3344 	EVUTIL_ASSERT(evcb->evcb_pri < base->nactivequeues);
3345 	TAILQ_INSERT_TAIL(&base->activequeues[evcb->evcb_pri],
3346 	    evcb, evcb_active_next);
3347 }
3348 
3349 static void
3350 event_queue_insert_active_later(struct event_base *base, struct event_callback *evcb)
3351 {
3352 	EVENT_BASE_ASSERT_LOCKED(base);
3353 	if (evcb->evcb_flags & (EVLIST_ACTIVE_LATER|EVLIST_ACTIVE)) {
3354 		/* Double insertion is possible */
3355 		return;
3356 	}
3357 
3358 	INCR_EVENT_COUNT(base, evcb->evcb_flags);
3359 	evcb->evcb_flags |= EVLIST_ACTIVE_LATER;
3360 	base->event_count_active++;
3361 	MAX_EVENT_COUNT(base->event_count_active_max, base->event_count_active);
3362 	EVUTIL_ASSERT(evcb->evcb_pri < base->nactivequeues);
3363 	TAILQ_INSERT_TAIL(&base->active_later_queue, evcb, evcb_active_next);
3364 }
3365 
3366 static void
3367 event_queue_insert_timeout(struct event_base *base, struct event *ev)
3368 {
3369 	EVENT_BASE_ASSERT_LOCKED(base);
3370 
3371 	if (EVUTIL_FAILURE_CHECK(ev->ev_flags & EVLIST_TIMEOUT)) {
3372 		event_errx(1, "%s: %p(fd "EV_SOCK_FMT") already on timeout", __func__,
3373 		    ev, EV_SOCK_ARG(ev->ev_fd));
3374 		return;
3375 	}
3376 
3377 	INCR_EVENT_COUNT(base, ev->ev_flags);
3378 
3379 	ev->ev_flags |= EVLIST_TIMEOUT;
3380 
3381 	if (is_common_timeout(&ev->ev_timeout, base)) {
3382 		struct common_timeout_list *ctl =
3383 		    get_common_timeout_list(base, &ev->ev_timeout);
3384 		insert_common_timeout_inorder(ctl, ev);
3385 	} else {
3386 		min_heap_push_(&base->timeheap, ev);
3387 	}
3388 }
3389 
3390 static void
3391 event_queue_make_later_events_active(struct event_base *base)
3392 {
3393 	struct event_callback *evcb;
3394 	EVENT_BASE_ASSERT_LOCKED(base);
3395 
3396 	while ((evcb = TAILQ_FIRST(&base->active_later_queue))) {
3397 		TAILQ_REMOVE(&base->active_later_queue, evcb, evcb_active_next);
3398 		evcb->evcb_flags = (evcb->evcb_flags & ~EVLIST_ACTIVE_LATER) | EVLIST_ACTIVE;
3399 		EVUTIL_ASSERT(evcb->evcb_pri < base->nactivequeues);
3400 		TAILQ_INSERT_TAIL(&base->activequeues[evcb->evcb_pri], evcb, evcb_active_next);
3401 		base->n_deferreds_queued += (evcb->evcb_closure == EV_CLOSURE_CB_SELF);
3402 	}
3403 }
3404 
3405 /* Functions for debugging */
3406 
3407 const char *
3408 event_get_version(void)
3409 {
3410 	return (EVENT__VERSION);
3411 }
3412 
3413 ev_uint32_t
3414 event_get_version_number(void)
3415 {
3416 	return (EVENT__NUMERIC_VERSION);
3417 }
3418 
3419 /*
3420  * No thread-safe interface needed - the information should be the same
3421  * for all threads.
3422  */
3423 
3424 const char *
3425 event_get_method(void)
3426 {
3427 	return (current_base->evsel->name);
3428 }
3429 
3430 #ifndef EVENT__DISABLE_MM_REPLACEMENT
3431 static void *(*mm_malloc_fn_)(size_t sz) = NULL;
3432 static void *(*mm_realloc_fn_)(void *p, size_t sz) = NULL;
3433 static void (*mm_free_fn_)(void *p) = NULL;
3434 
3435 void *
3436 event_mm_malloc_(size_t sz)
3437 {
3438 	if (sz == 0)
3439 		return NULL;
3440 
3441 	if (mm_malloc_fn_)
3442 		return mm_malloc_fn_(sz);
3443 	else
3444 		return malloc(sz);
3445 }
3446 
3447 void *
3448 event_mm_calloc_(size_t count, size_t size)
3449 {
3450 	if (count == 0 || size == 0)
3451 		return NULL;
3452 
3453 	if (mm_malloc_fn_) {
3454 		size_t sz = count * size;
3455 		void *p = NULL;
3456 		if (count > EV_SIZE_MAX / size)
3457 			goto error;
3458 		p = mm_malloc_fn_(sz);
3459 		if (p)
3460 			return memset(p, 0, sz);
3461 	} else {
3462 		void *p = calloc(count, size);
3463 #ifdef _WIN32
3464 		/* Windows calloc doesn't reliably set ENOMEM */
3465 		if (p == NULL)
3466 			goto error;
3467 #endif
3468 		return p;
3469 	}
3470 
3471 error:
3472 	errno = ENOMEM;
3473 	return NULL;
3474 }
3475 
3476 char *
3477 event_mm_strdup_(const char *str)
3478 {
3479 	if (!str) {
3480 		errno = EINVAL;
3481 		return NULL;
3482 	}
3483 
3484 	if (mm_malloc_fn_) {
3485 		size_t ln = strlen(str);
3486 		void *p = NULL;
3487 		if (ln == EV_SIZE_MAX)
3488 			goto error;
3489 		p = mm_malloc_fn_(ln+1);
3490 		if (p)
3491 			return memcpy(p, str, ln+1);
3492 	} else
3493 #ifdef _WIN32
3494 		return _strdup(str);
3495 #else
3496 		return strdup(str);
3497 #endif
3498 
3499 error:
3500 	errno = ENOMEM;
3501 	return NULL;
3502 }
3503 
3504 void *
3505 event_mm_realloc_(void *ptr, size_t sz)
3506 {
3507 	if (mm_realloc_fn_)
3508 		return mm_realloc_fn_(ptr, sz);
3509 	else
3510 		return realloc(ptr, sz);
3511 }
3512 
3513 void
3514 event_mm_free_(void *ptr)
3515 {
3516 	if (mm_free_fn_)
3517 		mm_free_fn_(ptr);
3518 	else
3519 		free(ptr);
3520 }
3521 
3522 void
3523 event_set_mem_functions(void *(*malloc_fn)(size_t sz),
3524 			void *(*realloc_fn)(void *ptr, size_t sz),
3525 			void (*free_fn)(void *ptr))
3526 {
3527 	mm_malloc_fn_ = malloc_fn;
3528 	mm_realloc_fn_ = realloc_fn;
3529 	mm_free_fn_ = free_fn;
3530 }
3531 #endif
3532 
3533 #ifdef EVENT__HAVE_EVENTFD
3534 static void
3535 evthread_notify_drain_eventfd(evutil_socket_t fd, short what, void *arg)
3536 {
3537 	ev_uint64_t msg;
3538 	ev_ssize_t r;
3539 	struct event_base *base = arg;
3540 
3541 	r = read(fd, (void*) &msg, sizeof(msg));
3542 	if (r<0 && errno != EAGAIN) {
3543 		event_sock_warn(fd, "Error reading from eventfd");
3544 	}
3545 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
3546 	base->is_notify_pending = 0;
3547 	EVBASE_RELEASE_LOCK(base, th_base_lock);
3548 }
3549 #endif
3550 
3551 static void
3552 evthread_notify_drain_default(evutil_socket_t fd, short what, void *arg)
3553 {
3554 	unsigned char buf[1024];
3555 	struct event_base *base = arg;
3556 #ifdef _WIN32
3557 	while (recv(fd, (char*)buf, sizeof(buf), 0) > 0)
3558 		;
3559 #else
3560 	while (read(fd, (char*)buf, sizeof(buf)) > 0)
3561 		;
3562 #endif
3563 
3564 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
3565 	base->is_notify_pending = 0;
3566 	EVBASE_RELEASE_LOCK(base, th_base_lock);
3567 }
3568 
3569 int
3570 evthread_make_base_notifiable(struct event_base *base)
3571 {
3572 	int r;
3573 	if (!base)
3574 		return -1;
3575 
3576 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
3577 	r = evthread_make_base_notifiable_nolock_(base);
3578 	EVBASE_RELEASE_LOCK(base, th_base_lock);
3579 	return r;
3580 }
3581 
3582 static int
3583 evthread_make_base_notifiable_nolock_(struct event_base *base)
3584 {
3585 	void (*cb)(evutil_socket_t, short, void *);
3586 	int (*notify)(struct event_base *);
3587 
3588 	if (base->th_notify_fn != NULL) {
3589 		/* The base is already notifiable: we're doing fine. */
3590 		return 0;
3591 	}
3592 
3593 #if defined(EVENT__HAVE_WORKING_KQUEUE)
3594 	if (base->evsel == &kqops && event_kq_add_notify_event_(base) == 0) {
3595 		base->th_notify_fn = event_kq_notify_base_;
3596 		/* No need to add an event here; the backend can wake
3597 		 * itself up just fine. */
3598 		return 0;
3599 	}
3600 #endif
3601 
3602 #ifdef EVENT__HAVE_EVENTFD
3603 	base->th_notify_fd[0] = evutil_eventfd_(0,
3604 	    EVUTIL_EFD_CLOEXEC|EVUTIL_EFD_NONBLOCK);
3605 	if (base->th_notify_fd[0] >= 0) {
3606 		base->th_notify_fd[1] = -1;
3607 		notify = evthread_notify_base_eventfd;
3608 		cb = evthread_notify_drain_eventfd;
3609 	} else
3610 #endif
3611 	if (evutil_make_internal_pipe_(base->th_notify_fd) == 0) {
3612 		notify = evthread_notify_base_default;
3613 		cb = evthread_notify_drain_default;
3614 	} else {
3615 		return -1;
3616 	}
3617 
3618 	base->th_notify_fn = notify;
3619 
3620 	/* prepare an event that we can use for wakeup */
3621 	event_assign(&base->th_notify, base, base->th_notify_fd[0],
3622 				 EV_READ|EV_PERSIST, cb, base);
3623 
3624 	/* we need to mark this as internal event */
3625 	base->th_notify.ev_flags |= EVLIST_INTERNAL;
3626 	event_priority_set(&base->th_notify, 0);
3627 
3628 	return event_add_nolock_(&base->th_notify, NULL, 0);
3629 }
3630 
3631 int
3632 event_base_foreach_event_nolock_(struct event_base *base,
3633     event_base_foreach_event_cb fn, void *arg)
3634 {
3635 	int r, i;
3636 	unsigned u;
3637 	struct event *ev;
3638 
3639 	/* Start out with all the EVLIST_INSERTED events. */
3640 	if ((r = evmap_foreach_event_(base, fn, arg)))
3641 		return r;
3642 
3643 	/* Okay, now we deal with those events that have timeouts and are in
3644 	 * the min-heap. */
3645 	for (u = 0; u < base->timeheap.n; ++u) {
3646 		ev = base->timeheap.p[u];
3647 		if (ev->ev_flags & EVLIST_INSERTED) {
3648 			/* we already processed this one */
3649 			continue;
3650 		}
3651 		if ((r = fn(base, ev, arg)))
3652 			return r;
3653 	}
3654 
3655 	/* Now for the events in one of the timeout queues.
3656 	 * the min-heap. */
3657 	for (i = 0; i < base->n_common_timeouts; ++i) {
3658 		struct common_timeout_list *ctl =
3659 		    base->common_timeout_queues[i];
3660 		TAILQ_FOREACH(ev, &ctl->events,
3661 		    ev_timeout_pos.ev_next_with_common_timeout) {
3662 			if (ev->ev_flags & EVLIST_INSERTED) {
3663 				/* we already processed this one */
3664 				continue;
3665 			}
3666 			if ((r = fn(base, ev, arg)))
3667 				return r;
3668 		}
3669 	}
3670 
3671 	/* Finally, we deal wit all the active events that we haven't touched
3672 	 * yet. */
3673 	for (i = 0; i < base->nactivequeues; ++i) {
3674 		struct event_callback *evcb;
3675 		TAILQ_FOREACH(evcb, &base->activequeues[i], evcb_active_next) {
3676 			if ((evcb->evcb_flags & (EVLIST_INIT|EVLIST_INSERTED|EVLIST_TIMEOUT)) != EVLIST_INIT) {
3677 				/* This isn't an event (evlist_init clear), or
3678 				 * we already processed it. (inserted or
3679 				 * timeout set */
3680 				continue;
3681 			}
3682 			ev = event_callback_to_event(evcb);
3683 			if ((r = fn(base, ev, arg)))
3684 				return r;
3685 		}
3686 	}
3687 
3688 	return 0;
3689 }
3690 
3691 /* Helper for event_base_dump_events: called on each event in the event base;
3692  * dumps only the inserted events. */
3693 static int
3694 dump_inserted_event_fn(const struct event_base *base, const struct event *e, void *arg)
3695 {
3696 	FILE *output = arg;
3697 	const char *gloss = (e->ev_events & EV_SIGNAL) ?
3698 	    "sig" : "fd ";
3699 
3700 	if (! (e->ev_flags & (EVLIST_INSERTED|EVLIST_TIMEOUT)))
3701 		return 0;
3702 
3703 	fprintf(output, "  %p [%s "EV_SOCK_FMT"]%s%s%s%s%s%s",
3704 	    e, gloss, EV_SOCK_ARG(e->ev_fd),
3705 	    (e->ev_events&EV_READ)?" Read":"",
3706 	    (e->ev_events&EV_WRITE)?" Write":"",
3707 	    (e->ev_events&EV_CLOSED)?" EOF":"",
3708 	    (e->ev_events&EV_SIGNAL)?" Signal":"",
3709 	    (e->ev_events&EV_PERSIST)?" Persist":"",
3710 	    (e->ev_flags&EVLIST_INTERNAL)?" Internal":"");
3711 	if (e->ev_flags & EVLIST_TIMEOUT) {
3712 		struct timeval tv;
3713 		tv.tv_sec = e->ev_timeout.tv_sec;
3714 		tv.tv_usec = e->ev_timeout.tv_usec & MICROSECONDS_MASK;
3715 		evutil_timeradd(&tv, &base->tv_clock_diff, &tv);
3716 		fprintf(output, " Timeout=%ld.%06d",
3717 		    (long)tv.tv_sec, (int)(tv.tv_usec & MICROSECONDS_MASK));
3718 	}
3719 	fputc('\n', output);
3720 
3721 	return 0;
3722 }
3723 
3724 /* Helper for event_base_dump_events: called on each event in the event base;
3725  * dumps only the active events. */
3726 static int
3727 dump_active_event_fn(const struct event_base *base, const struct event *e, void *arg)
3728 {
3729 	FILE *output = arg;
3730 	const char *gloss = (e->ev_events & EV_SIGNAL) ?
3731 	    "sig" : "fd ";
3732 
3733 	if (! (e->ev_flags & (EVLIST_ACTIVE|EVLIST_ACTIVE_LATER)))
3734 		return 0;
3735 
3736 	fprintf(output, "  %p [%s "EV_SOCK_FMT", priority=%d]%s%s%s%s%s active%s%s\n",
3737 	    e, gloss, EV_SOCK_ARG(e->ev_fd), e->ev_pri,
3738 	    (e->ev_res&EV_READ)?" Read":"",
3739 	    (e->ev_res&EV_WRITE)?" Write":"",
3740 	    (e->ev_res&EV_CLOSED)?" EOF":"",
3741 	    (e->ev_res&EV_SIGNAL)?" Signal":"",
3742 	    (e->ev_res&EV_TIMEOUT)?" Timeout":"",
3743 	    (e->ev_flags&EVLIST_INTERNAL)?" [Internal]":"",
3744 	    (e->ev_flags&EVLIST_ACTIVE_LATER)?" [NextTime]":"");
3745 
3746 	return 0;
3747 }
3748 
3749 int
3750 event_base_foreach_event(struct event_base *base,
3751     event_base_foreach_event_cb fn, void *arg)
3752 {
3753 	int r;
3754 	if ((!fn) || (!base)) {
3755 		return -1;
3756 	}
3757 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
3758 	r = event_base_foreach_event_nolock_(base, fn, arg);
3759 	EVBASE_RELEASE_LOCK(base, th_base_lock);
3760 	return r;
3761 }
3762 
3763 
3764 void
3765 event_base_dump_events(struct event_base *base, FILE *output)
3766 {
3767 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
3768 	fprintf(output, "Inserted events:\n");
3769 	event_base_foreach_event_nolock_(base, dump_inserted_event_fn, output);
3770 
3771 	fprintf(output, "Active events:\n");
3772 	event_base_foreach_event_nolock_(base, dump_active_event_fn, output);
3773 	EVBASE_RELEASE_LOCK(base, th_base_lock);
3774 }
3775 
3776 void
3777 event_base_active_by_fd(struct event_base *base, evutil_socket_t fd, short events)
3778 {
3779 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
3780 	evmap_io_active_(base, fd, events & (EV_READ|EV_WRITE|EV_CLOSED));
3781 	EVBASE_RELEASE_LOCK(base, th_base_lock);
3782 }
3783 
3784 void
3785 event_base_active_by_signal(struct event_base *base, int sig)
3786 {
3787 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
3788 	evmap_signal_active_(base, sig, 1);
3789 	EVBASE_RELEASE_LOCK(base, th_base_lock);
3790 }
3791 
3792 
3793 void
3794 event_base_add_virtual_(struct event_base *base)
3795 {
3796 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
3797 	base->virtual_event_count++;
3798 	MAX_EVENT_COUNT(base->virtual_event_count_max, base->virtual_event_count);
3799 	EVBASE_RELEASE_LOCK(base, th_base_lock);
3800 }
3801 
3802 void
3803 event_base_del_virtual_(struct event_base *base)
3804 {
3805 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
3806 	EVUTIL_ASSERT(base->virtual_event_count > 0);
3807 	base->virtual_event_count--;
3808 	if (base->virtual_event_count == 0 && EVBASE_NEED_NOTIFY(base))
3809 		evthread_notify_base(base);
3810 	EVBASE_RELEASE_LOCK(base, th_base_lock);
3811 }
3812 
3813 static void
3814 event_free_debug_globals_locks(void)
3815 {
3816 #ifndef EVENT__DISABLE_THREAD_SUPPORT
3817 #ifndef EVENT__DISABLE_DEBUG_MODE
3818 	if (event_debug_map_lock_ != NULL) {
3819 		EVTHREAD_FREE_LOCK(event_debug_map_lock_, 0);
3820 		event_debug_map_lock_ = NULL;
3821 		evthreadimpl_disable_lock_debugging_();
3822 	}
3823 #endif /* EVENT__DISABLE_DEBUG_MODE */
3824 #endif /* EVENT__DISABLE_THREAD_SUPPORT */
3825 	return;
3826 }
3827 
3828 static void
3829 event_free_debug_globals(void)
3830 {
3831 	event_free_debug_globals_locks();
3832 }
3833 
3834 static void
3835 event_free_evsig_globals(void)
3836 {
3837 	evsig_free_globals_();
3838 }
3839 
3840 static void
3841 event_free_evutil_globals(void)
3842 {
3843 	evutil_free_globals_();
3844 }
3845 
3846 static void
3847 event_free_globals(void)
3848 {
3849 	event_free_debug_globals();
3850 	event_free_evsig_globals();
3851 	event_free_evutil_globals();
3852 }
3853 
3854 void
3855 libevent_global_shutdown(void)
3856 {
3857 	event_disable_debug_mode();
3858 	event_free_globals();
3859 }
3860 
3861 #ifndef EVENT__DISABLE_THREAD_SUPPORT
3862 int
3863 event_global_setup_locks_(const int enable_locks)
3864 {
3865 #ifndef EVENT__DISABLE_DEBUG_MODE
3866 	EVTHREAD_SETUP_GLOBAL_LOCK(event_debug_map_lock_, 0);
3867 #endif
3868 	if (evsig_global_setup_locks_(enable_locks) < 0)
3869 		return -1;
3870 	if (evutil_global_setup_locks_(enable_locks) < 0)
3871 		return -1;
3872 	if (evutil_secure_rng_global_setup_locks_(enable_locks) < 0)
3873 		return -1;
3874 	return 0;
3875 }
3876 #endif
3877 
3878 void
3879 event_base_assert_ok_(struct event_base *base)
3880 {
3881 	EVBASE_ACQUIRE_LOCK(base, th_base_lock);
3882 	event_base_assert_ok_nolock_(base);
3883 	EVBASE_RELEASE_LOCK(base, th_base_lock);
3884 }
3885 
3886 void
3887 event_base_assert_ok_nolock_(struct event_base *base)
3888 {
3889 	int i;
3890 	int count;
3891 
3892 	/* First do checks on the per-fd and per-signal lists */
3893 	evmap_check_integrity_(base);
3894 
3895 	/* Check the heap property */
3896 	for (i = 1; i < (int)base->timeheap.n; ++i) {
3897 		int parent = (i - 1) / 2;
3898 		struct event *ev, *p_ev;
3899 		ev = base->timeheap.p[i];
3900 		p_ev = base->timeheap.p[parent];
3901 		EVUTIL_ASSERT(ev->ev_flags & EVLIST_TIMEOUT);
3902 		EVUTIL_ASSERT(evutil_timercmp(&p_ev->ev_timeout, &ev->ev_timeout, <=));
3903 		EVUTIL_ASSERT(ev->ev_timeout_pos.min_heap_idx == i);
3904 	}
3905 
3906 	/* Check that the common timeouts are fine */
3907 	for (i = 0; i < base->n_common_timeouts; ++i) {
3908 		struct common_timeout_list *ctl = base->common_timeout_queues[i];
3909 		struct event *last=NULL, *ev;
3910 
3911 		EVUTIL_ASSERT_TAILQ_OK(&ctl->events, event, ev_timeout_pos.ev_next_with_common_timeout);
3912 
3913 		TAILQ_FOREACH(ev, &ctl->events, ev_timeout_pos.ev_next_with_common_timeout) {
3914 			if (last)
3915 				EVUTIL_ASSERT(evutil_timercmp(&last->ev_timeout, &ev->ev_timeout, <=));
3916 			EVUTIL_ASSERT(ev->ev_flags & EVLIST_TIMEOUT);
3917 			EVUTIL_ASSERT(is_common_timeout(&ev->ev_timeout,base));
3918 			EVUTIL_ASSERT(COMMON_TIMEOUT_IDX(&ev->ev_timeout) == i);
3919 			last = ev;
3920 		}
3921 	}
3922 
3923 	/* Check the active queues. */
3924 	count = 0;
3925 	for (i = 0; i < base->nactivequeues; ++i) {
3926 		struct event_callback *evcb;
3927 		EVUTIL_ASSERT_TAILQ_OK(&base->activequeues[i], event_callback, evcb_active_next);
3928 		TAILQ_FOREACH(evcb, &base->activequeues[i], evcb_active_next) {
3929 			EVUTIL_ASSERT((evcb->evcb_flags & (EVLIST_ACTIVE|EVLIST_ACTIVE_LATER)) == EVLIST_ACTIVE);
3930 			EVUTIL_ASSERT(evcb->evcb_pri == i);
3931 			++count;
3932 		}
3933 	}
3934 
3935 	{
3936 		struct event_callback *evcb;
3937 		TAILQ_FOREACH(evcb, &base->active_later_queue, evcb_active_next) {
3938 			EVUTIL_ASSERT((evcb->evcb_flags & (EVLIST_ACTIVE|EVLIST_ACTIVE_LATER)) == EVLIST_ACTIVE_LATER);
3939 			++count;
3940 		}
3941 	}
3942 	EVUTIL_ASSERT(count == base->event_count_active);
3943 }
3944