1 /* $NetBSD: event_struct.h,v 1.1.1.2 2015/01/29 06:38:27 spz Exp $ */ 2 /* $NetBSD: event_struct.h,v 1.1.1.2 2015/01/29 06:38:27 spz Exp $ */ 3 /* 4 * Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu> 5 * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. The name of the author may not be used to endorse or promote products 16 * derived from this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 #ifndef _EVENT2_EVENT_STRUCT_H_ 30 #define _EVENT2_EVENT_STRUCT_H_ 31 32 /** @file event2/event_struct.h 33 34 Structures used by event.h. Using these structures directly WILL harm 35 forward compatibility: be careful. 36 37 No field declared in this file should be used directly in user code. Except 38 for historical reasons, these fields would not be exposed at all. 39 */ 40 41 #ifdef __cplusplus 42 extern "C" { 43 #endif 44 45 #include <event2/event-config.h> 46 #ifdef _EVENT_HAVE_SYS_TYPES_H 47 #include <sys/types.h> 48 #endif 49 #ifdef _EVENT_HAVE_SYS_TIME_H 50 #include <sys/time.h> 51 #endif 52 53 /* For int types. */ 54 #include <event2/util.h> 55 56 /* For evkeyvalq */ 57 #include <event2/keyvalq_struct.h> 58 59 #define EVLIST_TIMEOUT 0x01 60 #define EVLIST_INSERTED 0x02 61 #define EVLIST_SIGNAL 0x04 62 #define EVLIST_ACTIVE 0x08 63 #define EVLIST_INTERNAL 0x10 64 #define EVLIST_INIT 0x80 65 66 /* EVLIST_X_ Private space: 0x1000-0xf000 */ 67 #define EVLIST_ALL (0xf000 | 0x9f) 68 69 /* Fix so that people don't have to run with <sys/queue.h> */ 70 #ifndef TAILQ_ENTRY 71 #define _EVENT_DEFINED_TQENTRY 72 #define TAILQ_ENTRY(type) \ 73 struct { \ 74 struct type *tqe_next; /* next element */ \ 75 struct type **tqe_prev; /* address of previous next element */ \ 76 } 77 #endif /* !TAILQ_ENTRY */ 78 79 #ifndef TAILQ_HEAD 80 #define _EVENT_DEFINED_TQHEAD 81 #define TAILQ_HEAD(name, type) \ 82 struct name { \ 83 struct type *tqh_first; \ 84 struct type **tqh_last; \ 85 } 86 #endif 87 88 struct event_base; 89 struct event { 90 TAILQ_ENTRY(event) ev_active_next; 91 TAILQ_ENTRY(event) ev_next; 92 /* for managing timeouts */ 93 union { 94 TAILQ_ENTRY(event) ev_next_with_common_timeout; 95 int min_heap_idx; 96 } ev_timeout_pos; 97 evutil_socket_t ev_fd; 98 99 struct event_base *ev_base; 100 101 union { 102 /* used for io events */ 103 struct { 104 TAILQ_ENTRY(event) ev_io_next; 105 struct timeval ev_timeout; 106 } ev_io; 107 108 /* used by signal events */ 109 struct { 110 TAILQ_ENTRY(event) ev_signal_next; 111 short ev_ncalls; 112 /* Allows deletes in callback */ 113 short *ev_pncalls; 114 } ev_signal; 115 } _ev; 116 117 short ev_events; 118 short ev_res; /* result passed to event callback */ 119 short ev_flags; 120 ev_uint8_t ev_pri; /* smaller numbers are higher priority */ 121 ev_uint8_t ev_closure; 122 struct timeval ev_timeout; 123 124 /* allows us to adopt for different types of events */ 125 void (*ev_callback)(evutil_socket_t, short, void *arg); 126 void *ev_arg; 127 }; 128 129 TAILQ_HEAD (event_list, event); 130 131 #ifdef _EVENT_DEFINED_TQENTRY 132 #undef TAILQ_ENTRY 133 #endif 134 135 #ifdef _EVENT_DEFINED_TQHEAD 136 #undef TAILQ_HEAD 137 #endif 138 139 #ifdef __cplusplus 140 } 141 #endif 142 143 #endif /* _EVENT2_EVENT_STRUCT_H_ */ 144