1*6777b538SAndroid Build Coastguard Worker /* 2*6777b538SAndroid Build Coastguard Worker * Copyright (c) 2000-2004 Niels Provos <[email protected]> 3*6777b538SAndroid Build Coastguard Worker * All rights reserved. 4*6777b538SAndroid Build Coastguard Worker * 5*6777b538SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 6*6777b538SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions 7*6777b538SAndroid Build Coastguard Worker * are met: 8*6777b538SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright 9*6777b538SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 10*6777b538SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 11*6777b538SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 12*6777b538SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 13*6777b538SAndroid Build Coastguard Worker * 3. The name of the author may not be used to endorse or promote products 14*6777b538SAndroid Build Coastguard Worker * derived from this software without specific prior written permission. 15*6777b538SAndroid Build Coastguard Worker * 16*6777b538SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17*6777b538SAndroid Build Coastguard Worker * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18*6777b538SAndroid Build Coastguard Worker * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19*6777b538SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20*6777b538SAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21*6777b538SAndroid Build Coastguard Worker * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22*6777b538SAndroid Build Coastguard Worker * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23*6777b538SAndroid Build Coastguard Worker * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24*6777b538SAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25*6777b538SAndroid Build Coastguard Worker * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26*6777b538SAndroid Build Coastguard Worker */ 27*6777b538SAndroid Build Coastguard Worker #ifndef _EVENT_INTERNAL_H_ 28*6777b538SAndroid Build Coastguard Worker #define _EVENT_INTERNAL_H_ 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker #ifdef __cplusplus 31*6777b538SAndroid Build Coastguard Worker extern "C" { 32*6777b538SAndroid Build Coastguard Worker #endif 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker #include "config.h" 35*6777b538SAndroid Build Coastguard Worker #include "min_heap.h" 36*6777b538SAndroid Build Coastguard Worker #include "evsignal.h" 37*6777b538SAndroid Build Coastguard Worker 38*6777b538SAndroid Build Coastguard Worker struct eventop { 39*6777b538SAndroid Build Coastguard Worker const char *name; 40*6777b538SAndroid Build Coastguard Worker void *(*init)(struct event_base *); 41*6777b538SAndroid Build Coastguard Worker int (*add)(void *, struct event *); 42*6777b538SAndroid Build Coastguard Worker int (*del)(void *, struct event *); 43*6777b538SAndroid Build Coastguard Worker int (*dispatch)(struct event_base *, void *, struct timeval *); 44*6777b538SAndroid Build Coastguard Worker void (*dealloc)(struct event_base *, void *); 45*6777b538SAndroid Build Coastguard Worker /* set if we need to reinitialize the event base */ 46*6777b538SAndroid Build Coastguard Worker int need_reinit; 47*6777b538SAndroid Build Coastguard Worker }; 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker struct event_base { 50*6777b538SAndroid Build Coastguard Worker const struct eventop *evsel; 51*6777b538SAndroid Build Coastguard Worker void *evbase; 52*6777b538SAndroid Build Coastguard Worker int event_count; /* counts number of total events */ 53*6777b538SAndroid Build Coastguard Worker int event_count_active; /* counts number of active events */ 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker int event_gotterm; /* Set to terminate loop */ 56*6777b538SAndroid Build Coastguard Worker int event_break; /* Set to terminate loop immediately */ 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Worker /* active event management */ 59*6777b538SAndroid Build Coastguard Worker struct event_list **activequeues; 60*6777b538SAndroid Build Coastguard Worker int nactivequeues; 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker /* signal handling info */ 63*6777b538SAndroid Build Coastguard Worker struct evsignal_info sig; 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard Worker struct event_list eventqueue; 66*6777b538SAndroid Build Coastguard Worker struct timeval event_tv; 67*6777b538SAndroid Build Coastguard Worker 68*6777b538SAndroid Build Coastguard Worker struct min_heap timeheap; 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker struct timeval tv_cache; 71*6777b538SAndroid Build Coastguard Worker }; 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker /* Internal use only: Functions that might be missing from <sys/queue.h> */ 74*6777b538SAndroid Build Coastguard Worker #ifndef HAVE_TAILQFOREACH 75*6777b538SAndroid Build Coastguard Worker #define TAILQ_FIRST(head) ((head)->tqh_first) 76*6777b538SAndroid Build Coastguard Worker #define TAILQ_END(head) NULL 77*6777b538SAndroid Build Coastguard Worker #define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) 78*6777b538SAndroid Build Coastguard Worker #define TAILQ_FOREACH(var, head, field) \ 79*6777b538SAndroid Build Coastguard Worker for((var) = TAILQ_FIRST(head); \ 80*6777b538SAndroid Build Coastguard Worker (var) != TAILQ_END(head); \ 81*6777b538SAndroid Build Coastguard Worker (var) = TAILQ_NEXT(var, field)) 82*6777b538SAndroid Build Coastguard Worker #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ 83*6777b538SAndroid Build Coastguard Worker (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ 84*6777b538SAndroid Build Coastguard Worker (elm)->field.tqe_next = (listelm); \ 85*6777b538SAndroid Build Coastguard Worker *(listelm)->field.tqe_prev = (elm); \ 86*6777b538SAndroid Build Coastguard Worker (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ 87*6777b538SAndroid Build Coastguard Worker } while (0) 88*6777b538SAndroid Build Coastguard Worker #endif /* TAILQ_FOREACH */ 89*6777b538SAndroid Build Coastguard Worker 90*6777b538SAndroid Build Coastguard Worker int _evsignal_set_handler(struct event_base *base, int evsignal, 91*6777b538SAndroid Build Coastguard Worker void (*fn)(int)); 92*6777b538SAndroid Build Coastguard Worker int _evsignal_restore_handler(struct event_base *base, int evsignal); 93*6777b538SAndroid Build Coastguard Worker 94*6777b538SAndroid Build Coastguard Worker /* defined in evutil.c */ 95*6777b538SAndroid Build Coastguard Worker const char *evutil_getenv(const char *varname); 96*6777b538SAndroid Build Coastguard Worker 97*6777b538SAndroid Build Coastguard Worker #ifdef __cplusplus 98*6777b538SAndroid Build Coastguard Worker } 99*6777b538SAndroid Build Coastguard Worker #endif 100*6777b538SAndroid Build Coastguard Worker 101*6777b538SAndroid Build Coastguard Worker #endif /* _EVENT_INTERNAL_H_ */ 102