15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 2000-2004 Niels Provos <provos@citi.umich.edu>
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All rights reserved.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * modification, are permitted provided that the following conditions
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are met:
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    documentation and/or other materials provided with the distribution.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3. The name of the author may not be used to endorse or promote products
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    derived from this software without specific prior written permission.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef _EVENT_INTERNAL_H_
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _EVENT_INTERNAL_H_
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __cplusplus
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "config.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "min_heap.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "evsignal.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct eventop {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const char *name;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	void *(*init)(struct event_base *);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int (*add)(void *, struct event *);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int (*del)(void *, struct event *);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int (*dispatch)(struct event_base *, void *, struct timeval *);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	void (*dealloc)(struct event_base *, void *);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* set if we need to reinitialize the event base */
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int need_reinit;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct event_base {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const struct eventop *evsel;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	void *evbase;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int event_count;		/* counts number of total events */
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int event_count_active;	/* counts number of active events */
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int event_gotterm;		/* Set to terminate loop */
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int event_break;		/* Set to terminate loop immediately */
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* active event management */
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct event_list **activequeues;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int nactivequeues;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* signal handling info */
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct evsignal_info sig;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct event_list eventqueue;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct timeval event_tv;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct min_heap timeheap;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct timeval tv_cache;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Internal use only: Functions that might be missing from <sys/queue.h> */
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef HAVE_TAILQFOREACH
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	TAILQ_FIRST(head)		((head)->tqh_first)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	TAILQ_END(head)			NULL
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	TAILQ_NEXT(elm, field)		((elm)->field.tqe_next)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TAILQ_FOREACH(var, head, field)					\
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for((var) = TAILQ_FIRST(head);					\
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (var) != TAILQ_END(head);					\
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (var) = TAILQ_NEXT(var, field))
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define	TAILQ_INSERT_BEFORE(listelm, elm, field) do {			\
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.tqe_prev = (listelm)->field.tqe_prev;		\
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elm)->field.tqe_next = (listelm);				\
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*(listelm)->field.tqe_prev = (elm);				\
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(listelm)->field.tqe_prev = &(elm)->field.tqe_next;		\
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* TAILQ_FOREACH */
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _evsignal_set_handler(struct event_base *base, int evsignal,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  void (*fn)(int));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _evsignal_restore_handler(struct event_base *base, int evsignal);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* defined in evutil.c */
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *evutil_getenv(const char *varname);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __cplusplus
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* _EVENT_INTERNAL_H_ */
102