1 /* 2 * libevent compatibility header, only core events supported 3 * 4 * Copyright (c) 2007,2008,2010,2012 Marc Alexander Lehmann <[email protected]> 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without modifica- 8 * tion, are permitted provided that the following conditions are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright notice, 11 * this list of conditions and the following disclaimer. 12 * 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- 19 * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 20 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- 21 * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 23 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- 25 * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 26 * OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * Alternatively, the contents of this file may be used under the terms of 29 * the GNU General Public License ("GPL") version 2 or any later version, 30 * in which case the provisions of the GPL are applicable instead of 31 * the above. If you wish to allow the use of your version of this file 32 * only under the terms of the GPL and not to allow others to use your 33 * version of this file under the BSD license, indicate your decision 34 * by deleting the provisions above and replace them with the notice 35 * and other provisions required by the GPL. If you do not delete the 36 * provisions above, a recipient may use your version of this file under 37 * either the BSD or the GPL. 38 */ 39 40 #ifndef EVENT_H_ 41 #define EVENT_H_ 42 43 #ifdef EV_H 44 # include EV_H 45 #else 46 # include "ev.h" 47 #endif 48 49 #ifndef EVLOOP_NONBLOCK 50 # define EVLOOP_NONBLOCK EVRUN_NOWAIT 51 #endif 52 #ifndef EVLOOP_ONESHOT 53 # define EVLOOP_ONESHOT EVRUN_ONCE 54 #endif 55 #ifndef EV_TIMEOUT 56 # define EV_TIMEOUT EV_TIMER 57 #endif 58 59 #ifdef __cplusplus 60 extern "C" { 61 #endif 62 63 /* we need sys/time.h for struct timeval only */ 64 #if !defined (WIN32) || defined (__MINGW32__) 65 # include <time.h> /* mingw seems to need this, for whatever reason */ 66 # include <sys/time.h> 67 #endif 68 69 struct event_base; 70 71 #define EVLIST_TIMEOUT 0x01 72 #define EVLIST_INSERTED 0x02 73 #define EVLIST_SIGNAL 0x04 74 #define EVLIST_ACTIVE 0x08 75 #define EVLIST_INTERNAL 0x10 76 #define EVLIST_INIT 0x80 77 78 typedef void (*event_callback_fn)(int, short, void *); 79 80 struct event 81 { 82 /* libev watchers we map onto */ 83 union { 84 struct ev_io io; 85 struct ev_signal sig; 86 } iosig; 87 struct ev_timer to; 88 89 /* compatibility slots */ 90 struct event_base *ev_base; 91 event_callback_fn ev_callback; 92 void *ev_arg; 93 int ev_fd; 94 int ev_pri; 95 int ev_res; 96 int ev_flags; 97 short ev_events; 98 }; 99 100 event_callback_fn event_get_callback (const struct event *ev); 101 102 #define EV_READ EV_READ 103 #define EV_WRITE EV_WRITE 104 #define EV_PERSIST 0x10 105 #define EV_ET 0x20 /* nop */ 106 107 #define EVENT_SIGNAL(ev) ((int) (ev)->ev_fd) 108 #define EVENT_FD(ev) ((int) (ev)->ev_fd) 109 110 #define event_initialized(ev) ((ev)->ev_flags & EVLIST_INIT) 111 112 #define evtimer_add(ev,tv) event_add (ev, tv) 113 #define evtimer_set(ev,cb,data) event_set (ev, -1, 0, cb, data) 114 #define evtimer_del(ev) event_del (ev) 115 #define evtimer_pending(ev,tv) event_pending (ev, EV_TIMEOUT, tv) 116 #define evtimer_initialized(ev) event_initialized (ev) 117 118 #define timeout_add(ev,tv) evtimer_add (ev, tv) 119 #define timeout_set(ev,cb,data) evtimer_set (ev, cb, data) 120 #define timeout_del(ev) evtimer_del (ev) 121 #define timeout_pending(ev,tv) evtimer_pending (ev, tv) 122 #define timeout_initialized(ev) evtimer_initialized (ev) 123 124 #define signal_add(ev,tv) event_add (ev, tv) 125 #define signal_set(ev,sig,cb,data) event_set (ev, sig, EV_SIGNAL | EV_PERSIST, cb, data) 126 #define signal_del(ev) event_del (ev) 127 #define signal_pending(ev,tv) event_pending (ev, EV_SIGNAL, tv) 128 #define signal_initialized(ev) event_initialized (ev) 129 130 const char *event_get_version (void); 131 const char *event_get_method (void); 132 133 void *event_init (void); 134 void event_base_free (struct event_base *base); 135 136 #define EVLOOP_ONCE EVLOOP_ONESHOT 137 int event_loop (int); 138 int event_loopexit (struct timeval *tv); 139 int event_dispatch (void); 140 141 #define _EVENT_LOG_DEBUG 0 142 #define _EVENT_LOG_MSG 1 143 #define _EVENT_LOG_WARN 2 144 #define _EVENT_LOG_ERR 3 145 typedef void (*event_log_cb)(int severity, const char *msg); 146 void event_set_log_callback(event_log_cb cb); 147 148 void event_set (struct event *ev, int fd, short events, void (*cb)(int, short, void *), void *arg); 149 int event_once (int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv); 150 151 int event_add (struct event *ev, struct timeval *tv); 152 int event_del (struct event *ev); 153 void event_active (struct event *ev, int res, short ncalls); /* ncalls is being ignored */ 154 155 int event_pending (struct event *ev, short, struct timeval *tv); 156 157 int event_priority_init (int npri); 158 int event_priority_set (struct event *ev, int pri); 159 160 struct event_base *event_base_new (void); 161 const char *event_base_get_method (const struct event_base *); 162 int event_base_set (struct event_base *base, struct event *ev); 163 int event_base_loop (struct event_base *base, int); 164 int event_base_loopexit (struct event_base *base, struct timeval *tv); 165 int event_base_dispatch (struct event_base *base); 166 int event_base_once (struct event_base *base, int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv); 167 int event_base_priority_init (struct event_base *base, int fd); 168 169 /* next line is different in the libevent+libev version */ 170 /*libevent-include*/ 171 172 #ifdef __cplusplus 173 } 174 #endif 175 176 #endif 177 178