1*0a6a1f1dSLionel Sambuc /* $NetBSD: event.h,v 1.1.1.2 2015/01/29 06:38:26 spz Exp $ */ 2*0a6a1f1dSLionel Sambuc /* $NetBSD: event.h,v 1.1.1.2 2015/01/29 06:38:26 spz Exp $ */ 3e985b929SDavid van Moolenbroek /* 4e985b929SDavid van Moolenbroek * Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu> 5e985b929SDavid van Moolenbroek * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson 6e985b929SDavid van Moolenbroek * 7e985b929SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without 8e985b929SDavid van Moolenbroek * modification, are permitted provided that the following conditions 9e985b929SDavid van Moolenbroek * are met: 10e985b929SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright 11e985b929SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer. 12e985b929SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright 13e985b929SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the 14e985b929SDavid van Moolenbroek * documentation and/or other materials provided with the distribution. 15e985b929SDavid van Moolenbroek * 3. The name of the author may not be used to endorse or promote products 16e985b929SDavid van Moolenbroek * derived from this software without specific prior written permission. 17e985b929SDavid van Moolenbroek * 18e985b929SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19e985b929SDavid van Moolenbroek * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20e985b929SDavid van Moolenbroek * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21e985b929SDavid van Moolenbroek * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22e985b929SDavid van Moolenbroek * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23e985b929SDavid van Moolenbroek * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24e985b929SDavid van Moolenbroek * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25e985b929SDavid van Moolenbroek * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26e985b929SDavid van Moolenbroek * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27e985b929SDavid van Moolenbroek * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28e985b929SDavid van Moolenbroek */ 29e985b929SDavid van Moolenbroek #ifndef _EVENT2_EVENT_H_ 30e985b929SDavid van Moolenbroek #define _EVENT2_EVENT_H_ 31e985b929SDavid van Moolenbroek 32e985b929SDavid van Moolenbroek /** 33e985b929SDavid van Moolenbroek @mainpage 34e985b929SDavid van Moolenbroek 35e985b929SDavid van Moolenbroek @section intro Introduction 36e985b929SDavid van Moolenbroek 37e985b929SDavid van Moolenbroek Libevent is an event notification library for developing scalable network 38e985b929SDavid van Moolenbroek servers. The Libevent API provides a mechanism to execute a callback 39e985b929SDavid van Moolenbroek function when a specific event occurs on a file descriptor or after a 40e985b929SDavid van Moolenbroek timeout has been reached. Furthermore, Libevent also support callbacks due 41e985b929SDavid van Moolenbroek to signals or regular timeouts. 42e985b929SDavid van Moolenbroek 43e985b929SDavid van Moolenbroek Libevent is meant to replace the event loop found in event driven network 44e985b929SDavid van Moolenbroek servers. An application just needs to call event_dispatch() and then add or 45e985b929SDavid van Moolenbroek remove events dynamically without having to change the event loop. 46e985b929SDavid van Moolenbroek 47e985b929SDavid van Moolenbroek 48e985b929SDavid van Moolenbroek Currently, Libevent supports /dev/poll, kqueue(2), select(2), poll(2), 49e985b929SDavid van Moolenbroek epoll(4), and evports. The internal event mechanism is completely 50e985b929SDavid van Moolenbroek independent of the exposed event API, and a simple update of Libevent can 51e985b929SDavid van Moolenbroek provide new functionality without having to redesign the applications. As a 52e985b929SDavid van Moolenbroek result, Libevent allows for portable application development and provides 53e985b929SDavid van Moolenbroek the most scalable event notification mechanism available on an operating 54e985b929SDavid van Moolenbroek system. Libevent can also be used for multithreaded programs. Libevent 55e985b929SDavid van Moolenbroek should compile on Linux, *BSD, Mac OS X, Solaris and, Windows. 56e985b929SDavid van Moolenbroek 57e985b929SDavid van Moolenbroek @section usage Standard usage 58e985b929SDavid van Moolenbroek 59e985b929SDavid van Moolenbroek Every program that uses Libevent must inclurde the <event2/event.h> 60e985b929SDavid van Moolenbroek header, and pass the -levent flag to the linker. (You can instead link 61e985b929SDavid van Moolenbroek -levent_core if you only want the main event and buffered IO-based code, 62e985b929SDavid van Moolenbroek and don't want to link any protocol code.) 63e985b929SDavid van Moolenbroek 64e985b929SDavid van Moolenbroek @section setup Library setup 65e985b929SDavid van Moolenbroek 66e985b929SDavid van Moolenbroek Before you call any other Libevent functions, you need to set up the 67e985b929SDavid van Moolenbroek library. If you're going to use Libevent from multiple threads in a 68e985b929SDavid van Moolenbroek multithreaded application, you need to initialize thread support -- 69e985b929SDavid van Moolenbroek typically by using evthread_use_pthreads() or 70e985b929SDavid van Moolenbroek evthread_use_windows_threads(). See <event2/thread.h> for more 71e985b929SDavid van Moolenbroek information. 72e985b929SDavid van Moolenbroek 73e985b929SDavid van Moolenbroek This is also the point where you can replace Libevent's memory 74e985b929SDavid van Moolenbroek management functions with event_set_mem_functions, and enable debug mode 75e985b929SDavid van Moolenbroek with event_enable_debug_mode(). 76e985b929SDavid van Moolenbroek 77e985b929SDavid van Moolenbroek @section base Creating an event base 78e985b929SDavid van Moolenbroek 79e985b929SDavid van Moolenbroek Next, you need to create an event_base structure, using event_base_new() 80e985b929SDavid van Moolenbroek or event_base_new_with_config(). The event_base is responsible for 81e985b929SDavid van Moolenbroek keeping track of which events are "pending" (that is to say, being 82e985b929SDavid van Moolenbroek watched to see if they become active) and which events are "active". 83e985b929SDavid van Moolenbroek Every event is associated with a single event_base. 84e985b929SDavid van Moolenbroek 85e985b929SDavid van Moolenbroek @section event Event notification 86e985b929SDavid van Moolenbroek 87e985b929SDavid van Moolenbroek For each file descriptor that you wish to monitor, you must create an 88e985b929SDavid van Moolenbroek event structure with event_new(). (You may also declare an event 89e985b929SDavid van Moolenbroek structure and call event_assign() to initialize the members of the 90e985b929SDavid van Moolenbroek structure.) To enable notification, you add the structure to the list 91e985b929SDavid van Moolenbroek of monitored events by calling event_add(). The event structure must 92e985b929SDavid van Moolenbroek remain allocated as long as it is active, so it should generally be 93e985b929SDavid van Moolenbroek allocated on the heap. 94e985b929SDavid van Moolenbroek 95e985b929SDavid van Moolenbroek @section loop Dispaching evets. 96e985b929SDavid van Moolenbroek 97e985b929SDavid van Moolenbroek Finally, you call event_base_dispatch() to loop and dispatch events. 98e985b929SDavid van Moolenbroek You can also use event_base_loop() for more fine-grained control. 99e985b929SDavid van Moolenbroek 100e985b929SDavid van Moolenbroek Currently, only one thread can be dispatching a given event_base at a 101e985b929SDavid van Moolenbroek time. If you want to run events in multiple threads at once, you can 102e985b929SDavid van Moolenbroek either have a single event_base whose events add work to a work queue, 103e985b929SDavid van Moolenbroek or you can create multiple event_base objects. 104e985b929SDavid van Moolenbroek 105e985b929SDavid van Moolenbroek @section bufferevent I/O Buffers 106e985b929SDavid van Moolenbroek 107e985b929SDavid van Moolenbroek Libevent provides a buffered I/O abstraction on top of the regular event 108e985b929SDavid van Moolenbroek callbacks. This abstraction is called a bufferevent. A bufferevent 109e985b929SDavid van Moolenbroek provides input and output buffers that get filled and drained 110e985b929SDavid van Moolenbroek automatically. The user of a buffered event no longer deals directly 111e985b929SDavid van Moolenbroek with the I/O, but instead is reading from input and writing to output 112e985b929SDavid van Moolenbroek buffers. 113e985b929SDavid van Moolenbroek 114e985b929SDavid van Moolenbroek Once initialized via bufferevent_socket_new(), the bufferevent structure 115e985b929SDavid van Moolenbroek can be used repeatedly with bufferevent_enable() and 116e985b929SDavid van Moolenbroek bufferevent_disable(). Instead of reading and writing directly to a 117e985b929SDavid van Moolenbroek socket, you would call bufferevent_read() and bufferevent_write(). 118e985b929SDavid van Moolenbroek 119e985b929SDavid van Moolenbroek When read enabled the bufferevent will try to read from the file descriptor 120e985b929SDavid van Moolenbroek and call the read callback. The write callback is executed whenever the 121e985b929SDavid van Moolenbroek output buffer is drained below the write low watermark, which is 0 by 122e985b929SDavid van Moolenbroek default. 123e985b929SDavid van Moolenbroek 124e985b929SDavid van Moolenbroek See <event2/bufferevent*.h> for more information. 125e985b929SDavid van Moolenbroek 126e985b929SDavid van Moolenbroek @section timers Timers 127e985b929SDavid van Moolenbroek 128e985b929SDavid van Moolenbroek Libevent can also be used to create timers that invoke a callback after a 129e985b929SDavid van Moolenbroek certain amount of time has expired. The evtimer_new() function returns 130e985b929SDavid van Moolenbroek an event struct to use as a timer. To activate the timer, call 131e985b929SDavid van Moolenbroek evtimer_add(). Timers can be deactivated by calling evtimer_del(). 132e985b929SDavid van Moolenbroek 133e985b929SDavid van Moolenbroek @section evdns Asynchronous DNS resolution 134e985b929SDavid van Moolenbroek 135e985b929SDavid van Moolenbroek Libevent provides an asynchronous DNS resolver that should be used instead 136e985b929SDavid van Moolenbroek of the standard DNS resolver functions. See the <event2/dns.h> 137e985b929SDavid van Moolenbroek functions for more detail. 138e985b929SDavid van Moolenbroek 139e985b929SDavid van Moolenbroek @section evhttp Event-driven HTTP servers 140e985b929SDavid van Moolenbroek 141e985b929SDavid van Moolenbroek Libevent provides a very simple event-driven HTTP server that can be 142e985b929SDavid van Moolenbroek embedded in your program and used to service HTTP requests. 143e985b929SDavid van Moolenbroek 144e985b929SDavid van Moolenbroek To use this capability, you need to include the <event2/http.h> header in your 145e985b929SDavid van Moolenbroek program. See that header for more information. 146e985b929SDavid van Moolenbroek 147e985b929SDavid van Moolenbroek @section evrpc A framework for RPC servers and clients 148e985b929SDavid van Moolenbroek 149e985b929SDavid van Moolenbroek Libevent provides a framework for creating RPC servers and clients. It 150e985b929SDavid van Moolenbroek takes care of marshaling and unmarshaling all data structures. 151e985b929SDavid van Moolenbroek 152e985b929SDavid van Moolenbroek @section api API Reference 153e985b929SDavid van Moolenbroek 154e985b929SDavid van Moolenbroek To browse the complete documentation of the libevent API, click on any of 155e985b929SDavid van Moolenbroek the following links. 156e985b929SDavid van Moolenbroek 157e985b929SDavid van Moolenbroek event2/event.h 158e985b929SDavid van Moolenbroek The primary libevent header 159e985b929SDavid van Moolenbroek 160e985b929SDavid van Moolenbroek event2/thread.h 161e985b929SDavid van Moolenbroek Functions for use by multithreaded programs 162e985b929SDavid van Moolenbroek 163e985b929SDavid van Moolenbroek event2/buffer.h and event2/bufferevent.h 164e985b929SDavid van Moolenbroek Buffer management for network reading and writing 165e985b929SDavid van Moolenbroek 166e985b929SDavid van Moolenbroek event2/util.h 167e985b929SDavid van Moolenbroek Utility functions for portable nonblocking network code 168e985b929SDavid van Moolenbroek 169e985b929SDavid van Moolenbroek event2/dns.h 170e985b929SDavid van Moolenbroek Asynchronous DNS resolution 171e985b929SDavid van Moolenbroek 172e985b929SDavid van Moolenbroek event2/http.h 173e985b929SDavid van Moolenbroek An embedded libevent-based HTTP server 174e985b929SDavid van Moolenbroek 175e985b929SDavid van Moolenbroek event2/rpc.h 176e985b929SDavid van Moolenbroek A framework for creating RPC servers and clients 177e985b929SDavid van Moolenbroek 178e985b929SDavid van Moolenbroek */ 179e985b929SDavid van Moolenbroek 180e985b929SDavid van Moolenbroek /** @file event2/event.h 181e985b929SDavid van Moolenbroek 182e985b929SDavid van Moolenbroek Core functions for waiting for and receiving events, and using event bases. 183e985b929SDavid van Moolenbroek */ 184e985b929SDavid van Moolenbroek 185e985b929SDavid van Moolenbroek #ifdef __cplusplus 186e985b929SDavid van Moolenbroek extern "C" { 187e985b929SDavid van Moolenbroek #endif 188e985b929SDavid van Moolenbroek 189e985b929SDavid van Moolenbroek #include <event2/event-config.h> 190e985b929SDavid van Moolenbroek #ifdef _EVENT_HAVE_SYS_TYPES_H 191e985b929SDavid van Moolenbroek #include <sys/types.h> 192e985b929SDavid van Moolenbroek #endif 193e985b929SDavid van Moolenbroek #ifdef _EVENT_HAVE_SYS_TIME_H 194e985b929SDavid van Moolenbroek #include <sys/time.h> 195e985b929SDavid van Moolenbroek #endif 196e985b929SDavid van Moolenbroek 197e985b929SDavid van Moolenbroek #include <stdio.h> 198e985b929SDavid van Moolenbroek 199e985b929SDavid van Moolenbroek /* For int types. */ 200e985b929SDavid van Moolenbroek #include <event2/util.h> 201e985b929SDavid van Moolenbroek 202e985b929SDavid van Moolenbroek /** 203e985b929SDavid van Moolenbroek * Structure to hold information and state for a Libevent dispatch loop. 204e985b929SDavid van Moolenbroek * 205e985b929SDavid van Moolenbroek * The event_base lies at the center of Libevent; every application will 206e985b929SDavid van Moolenbroek * have one. It keeps track of all pending and active events, and 207e985b929SDavid van Moolenbroek * notifies your application of the active ones. 208e985b929SDavid van Moolenbroek * 209e985b929SDavid van Moolenbroek * This is an opaque structure; you can allocate one using 210e985b929SDavid van Moolenbroek * event_base_new() or event_base_new_with_config(). 211e985b929SDavid van Moolenbroek * 212e985b929SDavid van Moolenbroek * @see event_base_new(), event_base_free(), event_base_loop(), 213e985b929SDavid van Moolenbroek * event_base_new_with_config() 214e985b929SDavid van Moolenbroek */ 215e985b929SDavid van Moolenbroek struct event_base 216e985b929SDavid van Moolenbroek #ifdef _EVENT_IN_DOXYGEN 217e985b929SDavid van Moolenbroek {/*Empty body so that doxygen will generate documentation here.*/} 218e985b929SDavid van Moolenbroek #endif 219e985b929SDavid van Moolenbroek ; 220e985b929SDavid van Moolenbroek 221e985b929SDavid van Moolenbroek /** 222e985b929SDavid van Moolenbroek * @struct event 223e985b929SDavid van Moolenbroek * 224e985b929SDavid van Moolenbroek * Structure to represent a single event. 225e985b929SDavid van Moolenbroek * 226e985b929SDavid van Moolenbroek * An event can have some underlying condition it represents: a socket 227e985b929SDavid van Moolenbroek * becoming readable or writeable (or both), or a signal becoming raised. 228e985b929SDavid van Moolenbroek * (An event that represents no underlying condition is still useful: you 229e985b929SDavid van Moolenbroek * can use one to implement a timer, or to communicate between threads.) 230e985b929SDavid van Moolenbroek * 231e985b929SDavid van Moolenbroek * Generally, you can create events with event_new(), then make them 232e985b929SDavid van Moolenbroek * pending with event_add(). As your event_base runs, it will run the 233e985b929SDavid van Moolenbroek * callbacks of an events whose conditions are triggered. When you 234e985b929SDavid van Moolenbroek * longer want the event, free it with event_free(). 235e985b929SDavid van Moolenbroek * 236e985b929SDavid van Moolenbroek * In more depth: 237e985b929SDavid van Moolenbroek * 238e985b929SDavid van Moolenbroek * An event may be "pending" (one whose condition we are watching), 239e985b929SDavid van Moolenbroek * "active" (one whose condition has triggered and whose callback is about 240e985b929SDavid van Moolenbroek * to run), neither, or both. Events come into existence via 241e985b929SDavid van Moolenbroek * event_assign() or event_new(), and are then neither active nor pending. 242e985b929SDavid van Moolenbroek * 243e985b929SDavid van Moolenbroek * To make an event pending, pass it to event_add(). When doing so, you 244e985b929SDavid van Moolenbroek * can also set a timeout for the event. 245e985b929SDavid van Moolenbroek * 246e985b929SDavid van Moolenbroek * Events become active during an event_base_loop() call when either their 247e985b929SDavid van Moolenbroek * condition has triggered, or when their timeout has elapsed. You can 248e985b929SDavid van Moolenbroek * also activate an event manually using event_active(). The even_base 249e985b929SDavid van Moolenbroek * loop will run the callbacks of active events; after it has done so, it 250e985b929SDavid van Moolenbroek * marks them as no longer active. 251e985b929SDavid van Moolenbroek * 252e985b929SDavid van Moolenbroek * You can make an event non-pending by passing it to event_del(). This 253e985b929SDavid van Moolenbroek * also makes the event non-active. 254e985b929SDavid van Moolenbroek * 255e985b929SDavid van Moolenbroek * Events can be "persistent" or "non-persistent". A non-persistent event 256e985b929SDavid van Moolenbroek * becomes non-pending as soon as it is triggered: thus, it only runs at 257e985b929SDavid van Moolenbroek * most once per call to event_add(). A persistent event remains pending 258e985b929SDavid van Moolenbroek * even when it becomes active: you'll need to event_del() it manually in 259e985b929SDavid van Moolenbroek * order to make it non-pending. When a persistent event with a timeout 260e985b929SDavid van Moolenbroek * becomes active, its timeout is reset: this means you can use persistent 261e985b929SDavid van Moolenbroek * events to implement periodic timeouts. 262e985b929SDavid van Moolenbroek * 263e985b929SDavid van Moolenbroek * This should be treated as an opaque structure; you should never read or 264e985b929SDavid van Moolenbroek * write any of its fields directly. For backward compatibility with old 265e985b929SDavid van Moolenbroek * code, it is defined in the event2/event_struct.h header; including this 266e985b929SDavid van Moolenbroek * header may make your code incompatible with other versions of Libevent. 267e985b929SDavid van Moolenbroek * 268e985b929SDavid van Moolenbroek * @see event_new(), event_free(), event_assign(), event_get_assignment(), 269e985b929SDavid van Moolenbroek * event_add(), event_del(), event_active(), event_pending(), 270e985b929SDavid van Moolenbroek * event_get_fd(), event_get_base(), event_get_events(), 271e985b929SDavid van Moolenbroek * event_get_callback(), event_get_callback_arg(), 272e985b929SDavid van Moolenbroek * event_priority_set() 273e985b929SDavid van Moolenbroek */ 274e985b929SDavid van Moolenbroek struct event 275e985b929SDavid van Moolenbroek #ifdef _EVENT_IN_DOXYGEN 276e985b929SDavid van Moolenbroek {/*Empty body so that doxygen will generate documentation here.*/} 277e985b929SDavid van Moolenbroek #endif 278e985b929SDavid van Moolenbroek ; 279e985b929SDavid van Moolenbroek 280e985b929SDavid van Moolenbroek /** 281e985b929SDavid van Moolenbroek * Configuration for an event_base. 282e985b929SDavid van Moolenbroek * 283e985b929SDavid van Moolenbroek * There are many options that can be used to alter the behavior and 284e985b929SDavid van Moolenbroek * implementation of an event_base. To avoid having to pass them all in a 285e985b929SDavid van Moolenbroek * complex many-argument constructor, we provide an abstract data type 286e985b929SDavid van Moolenbroek * wrhere you set up configation information before passing it to 287e985b929SDavid van Moolenbroek * event_base_new_with_config(). 288e985b929SDavid van Moolenbroek * 289e985b929SDavid van Moolenbroek * @see event_config_new(), event_config_free(), event_base_new_with_config(), 290e985b929SDavid van Moolenbroek * event_config_avoid_method(), event_config_require_features(), 291e985b929SDavid van Moolenbroek * event_config_set_flag(), event_config_set_num_cpus_hint() 292e985b929SDavid van Moolenbroek */ 293e985b929SDavid van Moolenbroek struct event_config 294e985b929SDavid van Moolenbroek #ifdef _EVENT_IN_DOXYGEN 295e985b929SDavid van Moolenbroek {/*Empty body so that doxygen will generate documentation here.*/} 296e985b929SDavid van Moolenbroek #endif 297e985b929SDavid van Moolenbroek ; 298e985b929SDavid van Moolenbroek 299e985b929SDavid van Moolenbroek /** 300e985b929SDavid van Moolenbroek * Enable some relatively expensive debugging checks in Libevent that 301e985b929SDavid van Moolenbroek * would normally be turned off. Generally, these checks cause code that 302e985b929SDavid van Moolenbroek * would otherwise crash mysteriously to fail earlier with an assertion 303e985b929SDavid van Moolenbroek * failure. Note that this method MUST be called before any events or 304e985b929SDavid van Moolenbroek * event_bases have been created. 305e985b929SDavid van Moolenbroek * 306e985b929SDavid van Moolenbroek * Debug mode can currently catch the following errors: 307e985b929SDavid van Moolenbroek * An event is re-assigned while it is added 308e985b929SDavid van Moolenbroek * Any function is called on a non-assigned event 309e985b929SDavid van Moolenbroek * 310e985b929SDavid van Moolenbroek * Note that debugging mode uses memory to track every event that has been 311e985b929SDavid van Moolenbroek * initialized (via event_assign, event_set, or event_new) but not yet 312e985b929SDavid van Moolenbroek * released (via event_free or event_debug_unassign). If you want to use 313e985b929SDavid van Moolenbroek * debug mode, and you find yourself running out of memory, you will need 314e985b929SDavid van Moolenbroek * to use event_debug_unassign to explicitly stop tracking events that 315e985b929SDavid van Moolenbroek * are no longer considered set-up. 316e985b929SDavid van Moolenbroek * 317e985b929SDavid van Moolenbroek * @see event_debug_unassign() 318e985b929SDavid van Moolenbroek */ 319e985b929SDavid van Moolenbroek void event_enable_debug_mode(void); 320e985b929SDavid van Moolenbroek 321e985b929SDavid van Moolenbroek /** 322e985b929SDavid van Moolenbroek * When debugging mode is enabled, informs Libevent that an event should no 323e985b929SDavid van Moolenbroek * longer be considered as assigned. When debugging mode is not enabled, does 324e985b929SDavid van Moolenbroek * nothing. 325e985b929SDavid van Moolenbroek * 326e985b929SDavid van Moolenbroek * This function must only be called on a non-added event. 327e985b929SDavid van Moolenbroek * 328e985b929SDavid van Moolenbroek * @see event_enable_debug_mode() 329e985b929SDavid van Moolenbroek */ 330e985b929SDavid van Moolenbroek void event_debug_unassign(struct event *); 331e985b929SDavid van Moolenbroek 332e985b929SDavid van Moolenbroek /** 333e985b929SDavid van Moolenbroek * Create and return a new event_base to use with the rest of Libevent. 334e985b929SDavid van Moolenbroek * 335e985b929SDavid van Moolenbroek * @return a new event_base on success, or NULL on failure. 336e985b929SDavid van Moolenbroek * 337e985b929SDavid van Moolenbroek * @see event_base_free(), event_base_new_with_config() 338e985b929SDavid van Moolenbroek */ 339e985b929SDavid van Moolenbroek struct event_base *event_base_new(void); 340e985b929SDavid van Moolenbroek 341e985b929SDavid van Moolenbroek /** 342e985b929SDavid van Moolenbroek Reinitialize the event base after a fork 343e985b929SDavid van Moolenbroek 344e985b929SDavid van Moolenbroek Some event mechanisms do not survive across fork. The event base needs 345e985b929SDavid van Moolenbroek to be reinitialized with the event_reinit() function. 346e985b929SDavid van Moolenbroek 347e985b929SDavid van Moolenbroek @param base the event base that needs to be re-initialized 348e985b929SDavid van Moolenbroek @return 0 if successful, or -1 if some events could not be re-added. 349e985b929SDavid van Moolenbroek @see event_base_new() 350e985b929SDavid van Moolenbroek */ 351e985b929SDavid van Moolenbroek int event_reinit(struct event_base *base); 352e985b929SDavid van Moolenbroek 353e985b929SDavid van Moolenbroek /** 354e985b929SDavid van Moolenbroek Event dispatching loop 355e985b929SDavid van Moolenbroek 356*0a6a1f1dSLionel Sambuc This loop will run the event base until either there are no more pending or 357*0a6a1f1dSLionel Sambuc active, or until something calls event_base_loopbreak() or 358e985b929SDavid van Moolenbroek event_base_loopexit(). 359e985b929SDavid van Moolenbroek 360e985b929SDavid van Moolenbroek @param base the event_base structure returned by event_base_new() or 361e985b929SDavid van Moolenbroek event_base_new_with_config() 362*0a6a1f1dSLionel Sambuc @return 0 if successful, -1 if an error occurred, or 1 if we exited because 363*0a6a1f1dSLionel Sambuc no events were pending or active. 364e985b929SDavid van Moolenbroek @see event_base_loop() 365e985b929SDavid van Moolenbroek */ 366e985b929SDavid van Moolenbroek int event_base_dispatch(struct event_base *); 367e985b929SDavid van Moolenbroek 368e985b929SDavid van Moolenbroek /** 369e985b929SDavid van Moolenbroek Get the kernel event notification mechanism used by Libevent. 370e985b929SDavid van Moolenbroek 371e985b929SDavid van Moolenbroek @param eb the event_base structure returned by event_base_new() 372e985b929SDavid van Moolenbroek @return a string identifying the kernel event mechanism (kqueue, epoll, etc.) 373e985b929SDavid van Moolenbroek */ 374e985b929SDavid van Moolenbroek const char *event_base_get_method(const struct event_base *); 375e985b929SDavid van Moolenbroek 376e985b929SDavid van Moolenbroek /** 377e985b929SDavid van Moolenbroek Gets all event notification mechanisms supported by Libevent. 378e985b929SDavid van Moolenbroek 379e985b929SDavid van Moolenbroek This functions returns the event mechanism in order preferred by 380e985b929SDavid van Moolenbroek Libevent. Note that this list will include all backends that 381e985b929SDavid van Moolenbroek Libevent has compiled-in support for, and will not necessarily check 382e985b929SDavid van Moolenbroek your OS to see whether it has the required resources. 383e985b929SDavid van Moolenbroek 384e985b929SDavid van Moolenbroek @return an array with pointers to the names of support methods. 385e985b929SDavid van Moolenbroek The end of the array is indicated by a NULL pointer. If an 386e985b929SDavid van Moolenbroek error is encountered NULL is returned. 387e985b929SDavid van Moolenbroek */ 388e985b929SDavid van Moolenbroek const char **event_get_supported_methods(void); 389e985b929SDavid van Moolenbroek 390e985b929SDavid van Moolenbroek /** 391e985b929SDavid van Moolenbroek Allocates a new event configuration object. 392e985b929SDavid van Moolenbroek 393e985b929SDavid van Moolenbroek The event configuration object can be used to change the behavior of 394e985b929SDavid van Moolenbroek an event base. 395e985b929SDavid van Moolenbroek 396e985b929SDavid van Moolenbroek @return an event_config object that can be used to store configuration, or 397e985b929SDavid van Moolenbroek NULL if an error is encountered. 398e985b929SDavid van Moolenbroek @see event_base_new_with_config(), event_config_free(), event_config 399e985b929SDavid van Moolenbroek */ 400e985b929SDavid van Moolenbroek struct event_config *event_config_new(void); 401e985b929SDavid van Moolenbroek 402e985b929SDavid van Moolenbroek /** 403e985b929SDavid van Moolenbroek Deallocates all memory associated with an event configuration object 404e985b929SDavid van Moolenbroek 405e985b929SDavid van Moolenbroek @param cfg the event configuration object to be freed. 406e985b929SDavid van Moolenbroek */ 407e985b929SDavid van Moolenbroek void event_config_free(struct event_config *cfg); 408e985b929SDavid van Moolenbroek 409e985b929SDavid van Moolenbroek /** 410e985b929SDavid van Moolenbroek Enters an event method that should be avoided into the configuration. 411e985b929SDavid van Moolenbroek 412e985b929SDavid van Moolenbroek This can be used to avoid event mechanisms that do not support certain 413e985b929SDavid van Moolenbroek file descriptor types, or for debugging to avoid certain event 414e985b929SDavid van Moolenbroek mechanisms. An application can make use of multiple event bases to 415e985b929SDavid van Moolenbroek accommodate incompatible file descriptor types. 416e985b929SDavid van Moolenbroek 417e985b929SDavid van Moolenbroek @param cfg the event configuration object 418e985b929SDavid van Moolenbroek @param method the name of the event method to avoid 419e985b929SDavid van Moolenbroek @return 0 on success, -1 on failure. 420e985b929SDavid van Moolenbroek */ 421e985b929SDavid van Moolenbroek int event_config_avoid_method(struct event_config *cfg, const char *method); 422e985b929SDavid van Moolenbroek 423e985b929SDavid van Moolenbroek /** 424e985b929SDavid van Moolenbroek A flag used to describe which features an event_base (must) provide. 425e985b929SDavid van Moolenbroek 426e985b929SDavid van Moolenbroek Because of OS limitations, not every Libevent backend supports every 427e985b929SDavid van Moolenbroek possible feature. You can use this type with 428e985b929SDavid van Moolenbroek event_config_require_features() to tell Libevent to only proceed if your 429e985b929SDavid van Moolenbroek event_base implements a given feature, and you can receive this type from 430e985b929SDavid van Moolenbroek event_base_get_features() to see which features are available. 431e985b929SDavid van Moolenbroek */ 432e985b929SDavid van Moolenbroek enum event_method_feature { 433e985b929SDavid van Moolenbroek /** Require an event method that allows edge-triggered events with EV_ET. */ 434e985b929SDavid van Moolenbroek EV_FEATURE_ET = 0x01, 435e985b929SDavid van Moolenbroek /** Require an event method where having one event triggered among 436e985b929SDavid van Moolenbroek * many is [approximately] an O(1) operation. This excludes (for 437e985b929SDavid van Moolenbroek * example) select and poll, which are approximately O(N) for N 438e985b929SDavid van Moolenbroek * equal to the total number of possible events. */ 439e985b929SDavid van Moolenbroek EV_FEATURE_O1 = 0x02, 440e985b929SDavid van Moolenbroek /** Require an event method that allows file descriptors as well as 441e985b929SDavid van Moolenbroek * sockets. */ 442e985b929SDavid van Moolenbroek EV_FEATURE_FDS = 0x04 443e985b929SDavid van Moolenbroek }; 444e985b929SDavid van Moolenbroek 445e985b929SDavid van Moolenbroek /** 446e985b929SDavid van Moolenbroek A flag passed to event_config_set_flag(). 447e985b929SDavid van Moolenbroek 448e985b929SDavid van Moolenbroek These flags change the behavior of an allocated event_base. 449e985b929SDavid van Moolenbroek 450e985b929SDavid van Moolenbroek @see event_config_set_flag(), event_base_new_with_config(), 451e985b929SDavid van Moolenbroek event_method_feature 452e985b929SDavid van Moolenbroek */ 453e985b929SDavid van Moolenbroek enum event_base_config_flag { 454e985b929SDavid van Moolenbroek /** Do not allocate a lock for the event base, even if we have 455e985b929SDavid van Moolenbroek locking set up. */ 456e985b929SDavid van Moolenbroek EVENT_BASE_FLAG_NOLOCK = 0x01, 457e985b929SDavid van Moolenbroek /** Do not check the EVENT_* environment variables when configuring 458e985b929SDavid van Moolenbroek an event_base */ 459e985b929SDavid van Moolenbroek EVENT_BASE_FLAG_IGNORE_ENV = 0x02, 460e985b929SDavid van Moolenbroek /** Windows only: enable the IOCP dispatcher at startup 461e985b929SDavid van Moolenbroek 462e985b929SDavid van Moolenbroek If this flag is set then bufferevent_socket_new() and 463e985b929SDavid van Moolenbroek evconn_listener_new() will use IOCP-backed implementations 464e985b929SDavid van Moolenbroek instead of the usual select-based one on Windows. 465e985b929SDavid van Moolenbroek */ 466e985b929SDavid van Moolenbroek EVENT_BASE_FLAG_STARTUP_IOCP = 0x04, 467e985b929SDavid van Moolenbroek /** Instead of checking the current time every time the event loop is 468e985b929SDavid van Moolenbroek ready to run timeout callbacks, check after each timeout callback. 469e985b929SDavid van Moolenbroek */ 470e985b929SDavid van Moolenbroek EVENT_BASE_FLAG_NO_CACHE_TIME = 0x08, 471e985b929SDavid van Moolenbroek 472e985b929SDavid van Moolenbroek /** If we are using the epoll backend, this flag says that it is 473e985b929SDavid van Moolenbroek safe to use Libevent's internal change-list code to batch up 474e985b929SDavid van Moolenbroek adds and deletes in order to try to do as few syscalls as 475e985b929SDavid van Moolenbroek possible. Setting this flag can make your code run faster, but 476e985b929SDavid van Moolenbroek it may trigger a Linux bug: it is not safe to use this flag 477e985b929SDavid van Moolenbroek if you have any fds cloned by dup() or its variants. Doing so 478e985b929SDavid van Moolenbroek will produce strange and hard-to-diagnose bugs. 479e985b929SDavid van Moolenbroek 480e985b929SDavid van Moolenbroek This flag can also be activated by settnig the 481e985b929SDavid van Moolenbroek EVENT_EPOLL_USE_CHANGELIST environment variable. 482e985b929SDavid van Moolenbroek 483e985b929SDavid van Moolenbroek This flag has no effect if you wind up using a backend other than 484e985b929SDavid van Moolenbroek epoll. 485e985b929SDavid van Moolenbroek */ 486e985b929SDavid van Moolenbroek EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST = 0x10 487e985b929SDavid van Moolenbroek }; 488e985b929SDavid van Moolenbroek 489e985b929SDavid van Moolenbroek /** 490e985b929SDavid van Moolenbroek Return a bitmask of the features implemented by an event base. This 491e985b929SDavid van Moolenbroek will be a bitwise OR of one or more of the values of 492e985b929SDavid van Moolenbroek event_method_feature 493e985b929SDavid van Moolenbroek 494e985b929SDavid van Moolenbroek @see event_method_feature 495e985b929SDavid van Moolenbroek */ 496e985b929SDavid van Moolenbroek int event_base_get_features(const struct event_base *base); 497e985b929SDavid van Moolenbroek 498e985b929SDavid van Moolenbroek /** 499e985b929SDavid van Moolenbroek Enters a required event method feature that the application demands. 500e985b929SDavid van Moolenbroek 501e985b929SDavid van Moolenbroek Note that not every feature or combination of features is supported 502e985b929SDavid van Moolenbroek on every platform. Code that requests features should be prepared 503e985b929SDavid van Moolenbroek to handle the case where event_base_new_with_config() returns NULL, as in: 504e985b929SDavid van Moolenbroek <pre> 505e985b929SDavid van Moolenbroek event_config_require_features(cfg, EV_FEATURE_ET); 506e985b929SDavid van Moolenbroek base = event_base_new_with_config(cfg); 507e985b929SDavid van Moolenbroek if (base == NULL) { 508e985b929SDavid van Moolenbroek // We can't get edge-triggered behavior here. 509e985b929SDavid van Moolenbroek event_config_require_features(cfg, 0); 510e985b929SDavid van Moolenbroek base = event_base_new_with_config(cfg); 511e985b929SDavid van Moolenbroek } 512e985b929SDavid van Moolenbroek </pre> 513e985b929SDavid van Moolenbroek 514e985b929SDavid van Moolenbroek @param cfg the event configuration object 515e985b929SDavid van Moolenbroek @param feature a bitfield of one or more event_method_feature values. 516e985b929SDavid van Moolenbroek Replaces values from previous calls to this function. 517e985b929SDavid van Moolenbroek @return 0 on success, -1 on failure. 518e985b929SDavid van Moolenbroek @see event_method_feature, event_base_new_with_config() 519e985b929SDavid van Moolenbroek */ 520e985b929SDavid van Moolenbroek int event_config_require_features(struct event_config *cfg, int feature); 521e985b929SDavid van Moolenbroek 522e985b929SDavid van Moolenbroek /** 523e985b929SDavid van Moolenbroek * Sets one or more flags to configure what parts of the eventual event_base 524e985b929SDavid van Moolenbroek * will be initialized, and how they'll work. 525e985b929SDavid van Moolenbroek * 526e985b929SDavid van Moolenbroek * @see event_base_config_flags, event_base_new_with_config() 527e985b929SDavid van Moolenbroek **/ 528e985b929SDavid van Moolenbroek int event_config_set_flag(struct event_config *cfg, int flag); 529e985b929SDavid van Moolenbroek 530e985b929SDavid van Moolenbroek /** 531e985b929SDavid van Moolenbroek * Records a hint for the number of CPUs in the system. This is used for 532e985b929SDavid van Moolenbroek * tuning thread pools, etc, for optimal performance. In Libevent 2.0, 533e985b929SDavid van Moolenbroek * it is only on Windows, and only when IOCP is in use. 534e985b929SDavid van Moolenbroek * 535e985b929SDavid van Moolenbroek * @param cfg the event configuration object 536e985b929SDavid van Moolenbroek * @param cpus the number of cpus 537e985b929SDavid van Moolenbroek * @return 0 on success, -1 on failure. 538e985b929SDavid van Moolenbroek */ 539e985b929SDavid van Moolenbroek int event_config_set_num_cpus_hint(struct event_config *cfg, int cpus); 540e985b929SDavid van Moolenbroek 541e985b929SDavid van Moolenbroek /** 542e985b929SDavid van Moolenbroek Initialize the event API. 543e985b929SDavid van Moolenbroek 544e985b929SDavid van Moolenbroek Use event_base_new_with_config() to initialize a new event base, taking 545e985b929SDavid van Moolenbroek the specified configuration under consideration. The configuration object 546e985b929SDavid van Moolenbroek can currently be used to avoid certain event notification mechanisms. 547e985b929SDavid van Moolenbroek 548e985b929SDavid van Moolenbroek @param cfg the event configuration object 549e985b929SDavid van Moolenbroek @return an initialized event_base that can be used to registering events, 550e985b929SDavid van Moolenbroek or NULL if no event base can be created with the requested event_config. 551e985b929SDavid van Moolenbroek @see event_base_new(), event_base_free(), event_init(), event_assign() 552e985b929SDavid van Moolenbroek */ 553e985b929SDavid van Moolenbroek struct event_base *event_base_new_with_config(const struct event_config *); 554e985b929SDavid van Moolenbroek 555e985b929SDavid van Moolenbroek /** 556e985b929SDavid van Moolenbroek Deallocate all memory associated with an event_base, and free the base. 557e985b929SDavid van Moolenbroek 558e985b929SDavid van Moolenbroek Note that this function will not close any fds or free any memory passed 559e985b929SDavid van Moolenbroek to event_new as the argument to callback. 560e985b929SDavid van Moolenbroek 561e985b929SDavid van Moolenbroek @param eb an event_base to be freed 562e985b929SDavid van Moolenbroek */ 563e985b929SDavid van Moolenbroek void event_base_free(struct event_base *); 564e985b929SDavid van Moolenbroek 565e985b929SDavid van Moolenbroek /** @name Log severities 566e985b929SDavid van Moolenbroek */ 567e985b929SDavid van Moolenbroek /**@{*/ 568e985b929SDavid van Moolenbroek #define EVENT_LOG_DEBUG 0 569e985b929SDavid van Moolenbroek #define EVENT_LOG_MSG 1 570e985b929SDavid van Moolenbroek #define EVENT_LOG_WARN 2 571e985b929SDavid van Moolenbroek #define EVENT_LOG_ERR 3 572e985b929SDavid van Moolenbroek /**@}*/ 573e985b929SDavid van Moolenbroek 574e985b929SDavid van Moolenbroek /* Obsolete names: these are deprecated, but older programs might use them. 575e985b929SDavid van Moolenbroek * They violate the reserved-identifier namespace. */ 576e985b929SDavid van Moolenbroek #define _EVENT_LOG_DEBUG EVENT_LOG_DEBUG 577e985b929SDavid van Moolenbroek #define _EVENT_LOG_MSG EVENT_LOG_MSG 578e985b929SDavid van Moolenbroek #define _EVENT_LOG_WARN EVENT_LOG_WARN 579e985b929SDavid van Moolenbroek #define _EVENT_LOG_ERR EVENT_LOG_ERR 580e985b929SDavid van Moolenbroek 581e985b929SDavid van Moolenbroek /** 582e985b929SDavid van Moolenbroek A callback function used to intercept Libevent's log messages. 583e985b929SDavid van Moolenbroek 584e985b929SDavid van Moolenbroek @see event_set_log_callback 585e985b929SDavid van Moolenbroek */ 586e985b929SDavid van Moolenbroek typedef void (*event_log_cb)(int severity, const char *msg); 587e985b929SDavid van Moolenbroek /** 588e985b929SDavid van Moolenbroek Redirect Libevent's log messages. 589e985b929SDavid van Moolenbroek 590e985b929SDavid van Moolenbroek @param cb a function taking two arguments: an integer severity between 591e985b929SDavid van Moolenbroek _EVENT_LOG_DEBUG and _EVENT_LOG_ERR, and a string. If cb is NULL, 592e985b929SDavid van Moolenbroek then the default log is used. 593e985b929SDavid van Moolenbroek 594e985b929SDavid van Moolenbroek NOTE: The function you provide *must not* call any other libevent 595e985b929SDavid van Moolenbroek functionality. Doing so can produce undefined behavior. 596e985b929SDavid van Moolenbroek */ 597e985b929SDavid van Moolenbroek void event_set_log_callback(event_log_cb cb); 598e985b929SDavid van Moolenbroek 599e985b929SDavid van Moolenbroek /** 600e985b929SDavid van Moolenbroek A function to be called if Libevent encounters a fatal internal error. 601e985b929SDavid van Moolenbroek 602e985b929SDavid van Moolenbroek @see event_set_fatal_callback 603e985b929SDavid van Moolenbroek */ 604e985b929SDavid van Moolenbroek typedef void (*event_fatal_cb)(int err); 605e985b929SDavid van Moolenbroek 606e985b929SDavid van Moolenbroek /** 607e985b929SDavid van Moolenbroek Override Libevent's behavior in the event of a fatal internal error. 608e985b929SDavid van Moolenbroek 609e985b929SDavid van Moolenbroek By default, Libevent will call exit(1) if a programming error makes it 610e985b929SDavid van Moolenbroek impossible to continue correct operation. This function allows you to supply 611e985b929SDavid van Moolenbroek another callback instead. Note that if the function is ever invoked, 612e985b929SDavid van Moolenbroek something is wrong with your program, or with Libevent: any subsequent calls 613e985b929SDavid van Moolenbroek to Libevent may result in undefined behavior. 614e985b929SDavid van Moolenbroek 615e985b929SDavid van Moolenbroek Libevent will (almost) always log an _EVENT_LOG_ERR message before calling 616e985b929SDavid van Moolenbroek this function; look at the last log message to see why Libevent has died. 617e985b929SDavid van Moolenbroek */ 618e985b929SDavid van Moolenbroek void event_set_fatal_callback(event_fatal_cb cb); 619e985b929SDavid van Moolenbroek 620e985b929SDavid van Moolenbroek /** 621e985b929SDavid van Moolenbroek Associate a different event base with an event. 622e985b929SDavid van Moolenbroek 623e985b929SDavid van Moolenbroek The event to be associated must not be currently active or pending. 624e985b929SDavid van Moolenbroek 625e985b929SDavid van Moolenbroek @param eb the event base 626e985b929SDavid van Moolenbroek @param ev the event 627e985b929SDavid van Moolenbroek @return 0 on success, -1 on failure. 628e985b929SDavid van Moolenbroek */ 629e985b929SDavid van Moolenbroek int event_base_set(struct event_base *, struct event *); 630e985b929SDavid van Moolenbroek 631e985b929SDavid van Moolenbroek /** @name Loop flags 632e985b929SDavid van Moolenbroek 633e985b929SDavid van Moolenbroek These flags control the behavior of event_base_loop(). 634e985b929SDavid van Moolenbroek */ 635e985b929SDavid van Moolenbroek /**@{*/ 636e985b929SDavid van Moolenbroek /** Block until we have an active event, then exit once all active events 637e985b929SDavid van Moolenbroek * have had their callbacks run. */ 638e985b929SDavid van Moolenbroek #define EVLOOP_ONCE 0x01 639e985b929SDavid van Moolenbroek /** Do not block: see which events are ready now, run the callbacks 640e985b929SDavid van Moolenbroek * of the highest-priority ones, then exit. */ 641e985b929SDavid van Moolenbroek #define EVLOOP_NONBLOCK 0x02 642e985b929SDavid van Moolenbroek /**@}*/ 643e985b929SDavid van Moolenbroek 644e985b929SDavid van Moolenbroek /** 645e985b929SDavid van Moolenbroek Wait for events to become active, and run their callbacks. 646e985b929SDavid van Moolenbroek 647e985b929SDavid van Moolenbroek This is a more flexible version of event_base_dispatch(). 648e985b929SDavid van Moolenbroek 649e985b929SDavid van Moolenbroek By default, this loop will run the event base until either there are no more 650*0a6a1f1dSLionel Sambuc pending or active events, or until something calls event_base_loopbreak() or 651*0a6a1f1dSLionel Sambuc event_base_loopexit(). You can override this behavior with the 'flags' 652e985b929SDavid van Moolenbroek argument. 653e985b929SDavid van Moolenbroek 654e985b929SDavid van Moolenbroek @param eb the event_base structure returned by event_base_new() or 655e985b929SDavid van Moolenbroek event_base_new_with_config() 656e985b929SDavid van Moolenbroek @param flags any combination of EVLOOP_ONCE | EVLOOP_NONBLOCK 657*0a6a1f1dSLionel Sambuc @return 0 if successful, -1 if an error occurred, or 1 if we exited because 658*0a6a1f1dSLionel Sambuc no events were pending or active. 659e985b929SDavid van Moolenbroek @see event_base_loopexit(), event_base_dispatch(), EVLOOP_ONCE, 660e985b929SDavid van Moolenbroek EVLOOP_NONBLOCK 661e985b929SDavid van Moolenbroek */ 662e985b929SDavid van Moolenbroek int event_base_loop(struct event_base *, int); 663e985b929SDavid van Moolenbroek 664e985b929SDavid van Moolenbroek /** 665e985b929SDavid van Moolenbroek Exit the event loop after the specified time 666e985b929SDavid van Moolenbroek 667e985b929SDavid van Moolenbroek The next event_base_loop() iteration after the given timer expires will 668e985b929SDavid van Moolenbroek complete normally (handling all queued events) then exit without 669e985b929SDavid van Moolenbroek blocking for events again. 670e985b929SDavid van Moolenbroek 671e985b929SDavid van Moolenbroek Subsequent invocations of event_base_loop() will proceed normally. 672e985b929SDavid van Moolenbroek 673e985b929SDavid van Moolenbroek @param eb the event_base structure returned by event_init() 674e985b929SDavid van Moolenbroek @param tv the amount of time after which the loop should terminate, 675e985b929SDavid van Moolenbroek or NULL to exit after running all currently active events. 676e985b929SDavid van Moolenbroek @return 0 if successful, or -1 if an error occurred 677e985b929SDavid van Moolenbroek @see event_base_loopbreak() 678e985b929SDavid van Moolenbroek */ 679e985b929SDavid van Moolenbroek int event_base_loopexit(struct event_base *, const struct timeval *); 680e985b929SDavid van Moolenbroek 681e985b929SDavid van Moolenbroek /** 682e985b929SDavid van Moolenbroek Abort the active event_base_loop() immediately. 683e985b929SDavid van Moolenbroek 684e985b929SDavid van Moolenbroek event_base_loop() will abort the loop after the next event is completed; 685e985b929SDavid van Moolenbroek event_base_loopbreak() is typically invoked from this event's callback. 686e985b929SDavid van Moolenbroek This behavior is analogous to the "break;" statement. 687e985b929SDavid van Moolenbroek 688e985b929SDavid van Moolenbroek Subsequent invocations of event_loop() will proceed normally. 689e985b929SDavid van Moolenbroek 690e985b929SDavid van Moolenbroek @param eb the event_base structure returned by event_init() 691e985b929SDavid van Moolenbroek @return 0 if successful, or -1 if an error occurred 692e985b929SDavid van Moolenbroek @see event_base_loopexit() 693e985b929SDavid van Moolenbroek */ 694e985b929SDavid van Moolenbroek int event_base_loopbreak(struct event_base *); 695e985b929SDavid van Moolenbroek 696e985b929SDavid van Moolenbroek /** 697e985b929SDavid van Moolenbroek Checks if the event loop was told to exit by event_loopexit(). 698e985b929SDavid van Moolenbroek 699e985b929SDavid van Moolenbroek This function will return true for an event_base at every point after 700e985b929SDavid van Moolenbroek event_loopexit() is called, until the event loop is next entered. 701e985b929SDavid van Moolenbroek 702e985b929SDavid van Moolenbroek @param eb the event_base structure returned by event_init() 703e985b929SDavid van Moolenbroek @return true if event_base_loopexit() was called on this event base, 704e985b929SDavid van Moolenbroek or 0 otherwise 705e985b929SDavid van Moolenbroek @see event_base_loopexit() 706e985b929SDavid van Moolenbroek @see event_base_got_break() 707e985b929SDavid van Moolenbroek */ 708e985b929SDavid van Moolenbroek int event_base_got_exit(struct event_base *); 709e985b929SDavid van Moolenbroek 710e985b929SDavid van Moolenbroek /** 711e985b929SDavid van Moolenbroek Checks if the event loop was told to abort immediately by event_loopbreak(). 712e985b929SDavid van Moolenbroek 713e985b929SDavid van Moolenbroek This function will return true for an event_base at every point after 714e985b929SDavid van Moolenbroek event_loopbreak() is called, until the event loop is next entered. 715e985b929SDavid van Moolenbroek 716e985b929SDavid van Moolenbroek @param eb the event_base structure returned by event_init() 717e985b929SDavid van Moolenbroek @return true if event_base_loopbreak() was called on this event base, 718e985b929SDavid van Moolenbroek or 0 otherwise 719e985b929SDavid van Moolenbroek @see event_base_loopbreak() 720e985b929SDavid van Moolenbroek @see event_base_got_exit() 721e985b929SDavid van Moolenbroek */ 722e985b929SDavid van Moolenbroek int event_base_got_break(struct event_base *); 723e985b929SDavid van Moolenbroek 724e985b929SDavid van Moolenbroek /** 725e985b929SDavid van Moolenbroek * @name event flags 726e985b929SDavid van Moolenbroek * 727e985b929SDavid van Moolenbroek * Flags to pass to event_new(), event_assign(), event_pending(), and 728e985b929SDavid van Moolenbroek * anything else with an argument of the form "short events" 729e985b929SDavid van Moolenbroek */ 730e985b929SDavid van Moolenbroek /**@{*/ 731e985b929SDavid van Moolenbroek /** Indicates that a timeout has occurred. It's not necessary to pass 732e985b929SDavid van Moolenbroek * this flag to event_for new()/event_assign() to get a timeout. */ 733e985b929SDavid van Moolenbroek #define EV_TIMEOUT 0x01 734e985b929SDavid van Moolenbroek /** Wait for a socket or FD to become readable */ 735e985b929SDavid van Moolenbroek #define EV_READ 0x02 736e985b929SDavid van Moolenbroek /** Wait for a socket or FD to become writeable */ 737e985b929SDavid van Moolenbroek #define EV_WRITE 0x04 738e985b929SDavid van Moolenbroek /** Wait for a POSIX signal to be raised*/ 739e985b929SDavid van Moolenbroek #define EV_SIGNAL 0x08 740e985b929SDavid van Moolenbroek /** 741e985b929SDavid van Moolenbroek * Persistent event: won't get removed automatically when activated. 742e985b929SDavid van Moolenbroek * 743e985b929SDavid van Moolenbroek * When a persistent event with a timeout becomes activated, its timeout 744e985b929SDavid van Moolenbroek * is reset to 0. 745e985b929SDavid van Moolenbroek */ 746e985b929SDavid van Moolenbroek #define EV_PERSIST 0x10 747e985b929SDavid van Moolenbroek /** Select edge-triggered behavior, if supported by the backend. */ 748e985b929SDavid van Moolenbroek #define EV_ET 0x20 749e985b929SDavid van Moolenbroek /**@}*/ 750e985b929SDavid van Moolenbroek 751e985b929SDavid van Moolenbroek /** 752e985b929SDavid van Moolenbroek @name evtimer_* macros 753e985b929SDavid van Moolenbroek 754e985b929SDavid van Moolenbroek Aliases for working with one-shot timer events */ 755e985b929SDavid van Moolenbroek /**@{*/ 756e985b929SDavid van Moolenbroek #define evtimer_assign(ev, b, cb, arg) \ 757e985b929SDavid van Moolenbroek event_assign((ev), (b), -1, 0, (cb), (arg)) 758e985b929SDavid van Moolenbroek #define evtimer_new(b, cb, arg) event_new((b), -1, 0, (cb), (arg)) 759e985b929SDavid van Moolenbroek #define evtimer_add(ev, tv) event_add((ev), (tv)) 760e985b929SDavid van Moolenbroek #define evtimer_del(ev) event_del(ev) 761e985b929SDavid van Moolenbroek #define evtimer_pending(ev, tv) event_pending((ev), EV_TIMEOUT, (tv)) 762e985b929SDavid van Moolenbroek #define evtimer_initialized(ev) event_initialized(ev) 763e985b929SDavid van Moolenbroek /**@}*/ 764e985b929SDavid van Moolenbroek 765e985b929SDavid van Moolenbroek /** 766e985b929SDavid van Moolenbroek @name evsignal_* macros 767e985b929SDavid van Moolenbroek 768e985b929SDavid van Moolenbroek Aliases for working with signal events 769e985b929SDavid van Moolenbroek */ 770e985b929SDavid van Moolenbroek /**@{*/ 771e985b929SDavid van Moolenbroek #define evsignal_add(ev, tv) event_add((ev), (tv)) 772e985b929SDavid van Moolenbroek #define evsignal_assign(ev, b, x, cb, arg) \ 773e985b929SDavid van Moolenbroek event_assign((ev), (b), (x), EV_SIGNAL|EV_PERSIST, cb, (arg)) 774e985b929SDavid van Moolenbroek #define evsignal_new(b, x, cb, arg) \ 775e985b929SDavid van Moolenbroek event_new((b), (x), EV_SIGNAL|EV_PERSIST, (cb), (arg)) 776e985b929SDavid van Moolenbroek #define evsignal_del(ev) event_del(ev) 777e985b929SDavid van Moolenbroek #define evsignal_pending(ev, tv) event_pending((ev), EV_SIGNAL, (tv)) 778e985b929SDavid van Moolenbroek #define evsignal_initialized(ev) event_initialized(ev) 779e985b929SDavid van Moolenbroek /**@}*/ 780e985b929SDavid van Moolenbroek 781e985b929SDavid van Moolenbroek /** 782e985b929SDavid van Moolenbroek A callback function for an event. 783e985b929SDavid van Moolenbroek 784e985b929SDavid van Moolenbroek It receives three arguments: 785e985b929SDavid van Moolenbroek 786e985b929SDavid van Moolenbroek @param fd An fd or signal 787e985b929SDavid van Moolenbroek @param events One or more EV_* flags 788e985b929SDavid van Moolenbroek @param arg A user-supplied argument. 789e985b929SDavid van Moolenbroek 790e985b929SDavid van Moolenbroek @see event_new() 791e985b929SDavid van Moolenbroek */ 792e985b929SDavid van Moolenbroek typedef void (*event_callback_fn)(evutil_socket_t, short, void *); 793e985b929SDavid van Moolenbroek 794e985b929SDavid van Moolenbroek /** 795e985b929SDavid van Moolenbroek Allocate and asssign a new event structure, ready to be added. 796e985b929SDavid van Moolenbroek 797e985b929SDavid van Moolenbroek The function event_new() returns a new event that can be used in 798e985b929SDavid van Moolenbroek future calls to event_add() and event_del(). The fd and events 799e985b929SDavid van Moolenbroek arguments determine which conditions will trigger the event; the 800e985b929SDavid van Moolenbroek callback and callback_arg arguments tell Libevent what to do when the 801e985b929SDavid van Moolenbroek event becomes active. 802e985b929SDavid van Moolenbroek 803e985b929SDavid van Moolenbroek If events contains one of EV_READ, EV_WRITE, or EV_READ|EV_WRITE, then 804e985b929SDavid van Moolenbroek fd is a file descriptor or socket that should get monitored for 805e985b929SDavid van Moolenbroek readiness to read, readiness to write, or readiness for either operation 806e985b929SDavid van Moolenbroek (respectively). If events contains EV_SIGNAL, then fd is a signal 807e985b929SDavid van Moolenbroek number to wait for. If events contains none of those flags, then the 808e985b929SDavid van Moolenbroek event can be triggered only by a timeout or by manual activation with 809e985b929SDavid van Moolenbroek event_active(): In this case, fd must be -1. 810e985b929SDavid van Moolenbroek 811e985b929SDavid van Moolenbroek The EV_PERSIST flag can also be passed in the events argument: it makes 812e985b929SDavid van Moolenbroek event_add() persistent until event_del() is called. 813e985b929SDavid van Moolenbroek 814e985b929SDavid van Moolenbroek The EV_ET flag is compatible with EV_READ and EV_WRITE, and supported 815e985b929SDavid van Moolenbroek only by certain backends. It tells Libevent to use edge-triggered 816e985b929SDavid van Moolenbroek events. 817e985b929SDavid van Moolenbroek 818e985b929SDavid van Moolenbroek The EV_TIMEOUT flag has no effect here. 819e985b929SDavid van Moolenbroek 820e985b929SDavid van Moolenbroek It is okay to have multiple events all listening on the same fds; but 821e985b929SDavid van Moolenbroek they must either all be edge-triggered, or all not be edge triggerd. 822e985b929SDavid van Moolenbroek 823e985b929SDavid van Moolenbroek When the event becomes active, the event loop will run the provided 824e985b929SDavid van Moolenbroek callbuck function, with three arguments. The first will be the provided 825e985b929SDavid van Moolenbroek fd value. The second will be a bitfield of the events that triggered: 826e985b929SDavid van Moolenbroek EV_READ, EV_WRITE, or EV_SIGNAL. Here the EV_TIMEOUT flag indicates 827e985b929SDavid van Moolenbroek that a timeout occurred, and EV_ET indicates that an edge-triggered 828e985b929SDavid van Moolenbroek event occurred. The third event will be the callback_arg pointer that 829e985b929SDavid van Moolenbroek you provide. 830e985b929SDavid van Moolenbroek 831e985b929SDavid van Moolenbroek @param base the event base to which the event should be attached. 832e985b929SDavid van Moolenbroek @param fd the file descriptor or signal to be monitored, or -1. 833e985b929SDavid van Moolenbroek @param events desired events to monitor: bitfield of EV_READ, EV_WRITE, 834e985b929SDavid van Moolenbroek EV_SIGNAL, EV_PERSIST, EV_ET. 835e985b929SDavid van Moolenbroek @param callback callback function to be invoked when the event occurs 836e985b929SDavid van Moolenbroek @param callback_arg an argument to be passed to the callback function 837e985b929SDavid van Moolenbroek 838e985b929SDavid van Moolenbroek @return a newly allocated struct event that must later be freed with 839e985b929SDavid van Moolenbroek event_free(). 840e985b929SDavid van Moolenbroek @see event_free(), event_add(), event_del(), event_assign() 841e985b929SDavid van Moolenbroek */ 842e985b929SDavid van Moolenbroek struct event *event_new(struct event_base *, evutil_socket_t, short, event_callback_fn, void *); 843e985b929SDavid van Moolenbroek 844e985b929SDavid van Moolenbroek 845e985b929SDavid van Moolenbroek /** 846e985b929SDavid van Moolenbroek Prepare a new, already-allocated event structure to be added. 847e985b929SDavid van Moolenbroek 848e985b929SDavid van Moolenbroek The function event_assign() prepares the event structure ev to be used 849e985b929SDavid van Moolenbroek in future calls to event_add() and event_del(). Unlike event_new(), it 850e985b929SDavid van Moolenbroek doesn't allocate memory itself: it requires that you have already 851e985b929SDavid van Moolenbroek allocated a struct event, probably on the heap. Doing this will 852e985b929SDavid van Moolenbroek typically make your code depend on the size of the event structure, and 853e985b929SDavid van Moolenbroek thereby create incompatibility with future versions of Libevent. 854e985b929SDavid van Moolenbroek 855e985b929SDavid van Moolenbroek The easiest way to avoid this problem is just to use event_new() and 856e985b929SDavid van Moolenbroek event_free() instead. 857e985b929SDavid van Moolenbroek 858e985b929SDavid van Moolenbroek A slightly harder way to future-proof your code is to use 859e985b929SDavid van Moolenbroek event_get_struct_event_size() to determine the required size of an event 860e985b929SDavid van Moolenbroek at runtime. 861e985b929SDavid van Moolenbroek 862e985b929SDavid van Moolenbroek Note that it is NOT safe to call this function on an event that is 863e985b929SDavid van Moolenbroek active or pending. Doing so WILL corrupt internal data structures in 864e985b929SDavid van Moolenbroek Libevent, and lead to strange, hard-to-diagnose bugs. You _can_ use 865e985b929SDavid van Moolenbroek event_assign to change an existing event, but only if it is not active 866e985b929SDavid van Moolenbroek or pending! 867e985b929SDavid van Moolenbroek 868e985b929SDavid van Moolenbroek The arguments for this function, and the behavior of the events that it 869e985b929SDavid van Moolenbroek makes, are as for event_new(). 870e985b929SDavid van Moolenbroek 871e985b929SDavid van Moolenbroek @param ev an event struct to be modified 872e985b929SDavid van Moolenbroek @param base the event base to which ev should be attached. 873e985b929SDavid van Moolenbroek @param fd the file descriptor to be monitored 874e985b929SDavid van Moolenbroek @param events desired events to monitor; can be EV_READ and/or EV_WRITE 875e985b929SDavid van Moolenbroek @param callback callback function to be invoked when the event occurs 876e985b929SDavid van Moolenbroek @param callback_arg an argument to be passed to the callback function 877e985b929SDavid van Moolenbroek 878e985b929SDavid van Moolenbroek @return 0 if success, or -1 on invalid arguments. 879e985b929SDavid van Moolenbroek 880e985b929SDavid van Moolenbroek @see event_new(), event_add(), event_del(), event_base_once(), 881e985b929SDavid van Moolenbroek event_get_struct_event_size() 882e985b929SDavid van Moolenbroek */ 883e985b929SDavid van Moolenbroek int event_assign(struct event *, struct event_base *, evutil_socket_t, short, event_callback_fn, void *); 884e985b929SDavid van Moolenbroek 885e985b929SDavid van Moolenbroek /** 886e985b929SDavid van Moolenbroek Deallocate a struct event * returned by event_new(). 887e985b929SDavid van Moolenbroek 888e985b929SDavid van Moolenbroek If the event is pending or active, first make it non-pending and 889e985b929SDavid van Moolenbroek non-active. 890e985b929SDavid van Moolenbroek */ 891e985b929SDavid van Moolenbroek void event_free(struct event *); 892e985b929SDavid van Moolenbroek 893e985b929SDavid van Moolenbroek /** 894e985b929SDavid van Moolenbroek Schedule a one-time event 895e985b929SDavid van Moolenbroek 896e985b929SDavid van Moolenbroek The function event_base_once() is similar to event_set(). However, it 897e985b929SDavid van Moolenbroek schedules a callback to be called exactly once, and does not require the 898e985b929SDavid van Moolenbroek caller to prepare an event structure. 899e985b929SDavid van Moolenbroek 900e985b929SDavid van Moolenbroek Note that in Libevent 2.0 and earlier, if the event is never triggered, 901e985b929SDavid van Moolenbroek the internal memory used to hold it will never be freed. This may be 902e985b929SDavid van Moolenbroek fixed in a later version of Libevent. 903e985b929SDavid van Moolenbroek 904e985b929SDavid van Moolenbroek @param base an event_base 905e985b929SDavid van Moolenbroek @param fd a file descriptor to monitor, or -1 for no fd. 906e985b929SDavid van Moolenbroek @param events event(s) to monitor; can be any of EV_READ | 907e985b929SDavid van Moolenbroek EV_WRITE, or EV_TIMEOUT 908e985b929SDavid van Moolenbroek @param callback callback function to be invoked when the event occurs 909e985b929SDavid van Moolenbroek @param arg an argument to be passed to the callback function 910e985b929SDavid van Moolenbroek @param timeout the maximum amount of time to wait for the event. NULL 911e985b929SDavid van Moolenbroek makes an EV_READ/EV_WRITE event make forever; NULL makes an 912e985b929SDavid van Moolenbroek EV_TIMEOUT event succees immediately. 913e985b929SDavid van Moolenbroek @return 0 if successful, or -1 if an error occurred 914e985b929SDavid van Moolenbroek */ 915e985b929SDavid van Moolenbroek int event_base_once(struct event_base *, evutil_socket_t, short, event_callback_fn, void *, const struct timeval *); 916e985b929SDavid van Moolenbroek 917e985b929SDavid van Moolenbroek /** 918e985b929SDavid van Moolenbroek Add an event to the set of pending events. 919e985b929SDavid van Moolenbroek 920e985b929SDavid van Moolenbroek The function event_add() schedules the execution of the ev event when the 921e985b929SDavid van Moolenbroek event specified in event_assign()/event_new() occurs, or when the time 922e985b929SDavid van Moolenbroek specified in timeout has elapesed. If atimeout is NULL, no timeout 923e985b929SDavid van Moolenbroek occurs and the function will only be 924e985b929SDavid van Moolenbroek called if a matching event occurs. The event in the 925e985b929SDavid van Moolenbroek ev argument must be already initialized by event_assign() or event_new() 926e985b929SDavid van Moolenbroek and may not be used 927e985b929SDavid van Moolenbroek in calls to event_assign() until it is no longer pending. 928e985b929SDavid van Moolenbroek 929e985b929SDavid van Moolenbroek If the event in the ev argument already has a scheduled timeout, calling 930e985b929SDavid van Moolenbroek event_add() replaces the old timeout with the new one, or clears the old 931e985b929SDavid van Moolenbroek timeout if the timeout argument is NULL. 932e985b929SDavid van Moolenbroek 933e985b929SDavid van Moolenbroek @param ev an event struct initialized via event_set() 934e985b929SDavid van Moolenbroek @param timeout the maximum amount of time to wait for the event, or NULL 935e985b929SDavid van Moolenbroek to wait forever 936e985b929SDavid van Moolenbroek @return 0 if successful, or -1 if an error occurred 937e985b929SDavid van Moolenbroek @see event_del(), event_assign(), event_new() 938e985b929SDavid van Moolenbroek */ 939e985b929SDavid van Moolenbroek int event_add(struct event *ev, const struct timeval *timeout); 940e985b929SDavid van Moolenbroek 941e985b929SDavid van Moolenbroek /** 942e985b929SDavid van Moolenbroek Remove an event from the set of monitored events. 943e985b929SDavid van Moolenbroek 944e985b929SDavid van Moolenbroek The function event_del() will cancel the event in the argument ev. If the 945e985b929SDavid van Moolenbroek event has already executed or has never been added the call will have no 946e985b929SDavid van Moolenbroek effect. 947e985b929SDavid van Moolenbroek 948e985b929SDavid van Moolenbroek @param ev an event struct to be removed from the working set 949e985b929SDavid van Moolenbroek @return 0 if successful, or -1 if an error occurred 950e985b929SDavid van Moolenbroek @see event_add() 951e985b929SDavid van Moolenbroek */ 952e985b929SDavid van Moolenbroek int event_del(struct event *); 953e985b929SDavid van Moolenbroek 954e985b929SDavid van Moolenbroek 955e985b929SDavid van Moolenbroek /** 956e985b929SDavid van Moolenbroek Make an event active. 957e985b929SDavid van Moolenbroek 958e985b929SDavid van Moolenbroek You can use this function on a pending or a non-pending event to make it 959e985b929SDavid van Moolenbroek active, so that its callback will be run by event_base_dispatch() or 960e985b929SDavid van Moolenbroek event_base_loop(). 961e985b929SDavid van Moolenbroek 962e985b929SDavid van Moolenbroek One common use in multithreaded programs is to wake the thread running 963e985b929SDavid van Moolenbroek event_base_loop() from another thread. 964e985b929SDavid van Moolenbroek 965e985b929SDavid van Moolenbroek @param ev an event to make active. 966e985b929SDavid van Moolenbroek @param res a set of flags to pass to the event's callback. 967e985b929SDavid van Moolenbroek @param ncalls an obsolete argument: this is ignored. 968e985b929SDavid van Moolenbroek **/ 969e985b929SDavid van Moolenbroek void event_active(struct event *ev, int res, short ncalls); 970e985b929SDavid van Moolenbroek 971e985b929SDavid van Moolenbroek /** 972e985b929SDavid van Moolenbroek Checks if a specific event is pending or scheduled. 973e985b929SDavid van Moolenbroek 974e985b929SDavid van Moolenbroek @param ev an event struct previously passed to event_add() 975e985b929SDavid van Moolenbroek @param events the requested event type; any of EV_TIMEOUT|EV_READ| 976e985b929SDavid van Moolenbroek EV_WRITE|EV_SIGNAL 977e985b929SDavid van Moolenbroek @param tv if this field is not NULL, and the event has a timeout, 978e985b929SDavid van Moolenbroek this field is set to hold the time at which the timeout will 979e985b929SDavid van Moolenbroek expire. 980e985b929SDavid van Moolenbroek 981e985b929SDavid van Moolenbroek @return true if the event is pending on any of the events in 'what', (that 982e985b929SDavid van Moolenbroek is to say, it has been added), or 0 if the event is not added. 983e985b929SDavid van Moolenbroek */ 984e985b929SDavid van Moolenbroek int event_pending(const struct event *ev, short events, struct timeval *tv); 985e985b929SDavid van Moolenbroek 986e985b929SDavid van Moolenbroek 987e985b929SDavid van Moolenbroek /** 988e985b929SDavid van Moolenbroek Test if an event structure might be initialized. 989e985b929SDavid van Moolenbroek 990e985b929SDavid van Moolenbroek The event_initialized() function can be used to check if an event has been 991e985b929SDavid van Moolenbroek initialized. 992e985b929SDavid van Moolenbroek 993e985b929SDavid van Moolenbroek Warning: This function is only useful for distinguishing a a zeroed-out 994e985b929SDavid van Moolenbroek piece of memory from an initialized event, it can easily be confused by 995e985b929SDavid van Moolenbroek uninitialized memory. Thus, it should ONLY be used to distinguish an 996e985b929SDavid van Moolenbroek initialized event from zero. 997e985b929SDavid van Moolenbroek 998e985b929SDavid van Moolenbroek @param ev an event structure to be tested 999e985b929SDavid van Moolenbroek @return 1 if the structure might be initialized, or 0 if it has not been 1000e985b929SDavid van Moolenbroek initialized 1001e985b929SDavid van Moolenbroek */ 1002e985b929SDavid van Moolenbroek int event_initialized(const struct event *ev); 1003e985b929SDavid van Moolenbroek 1004e985b929SDavid van Moolenbroek /** 1005e985b929SDavid van Moolenbroek Get the signal number assigned to a signal event 1006e985b929SDavid van Moolenbroek */ 1007e985b929SDavid van Moolenbroek #define event_get_signal(ev) ((int)event_get_fd(ev)) 1008e985b929SDavid van Moolenbroek 1009e985b929SDavid van Moolenbroek /** 1010e985b929SDavid van Moolenbroek Get the socket or signal assigned to an event, or -1 if the event has 1011e985b929SDavid van Moolenbroek no socket. 1012e985b929SDavid van Moolenbroek */ 1013e985b929SDavid van Moolenbroek evutil_socket_t event_get_fd(const struct event *ev); 1014e985b929SDavid van Moolenbroek 1015e985b929SDavid van Moolenbroek /** 1016e985b929SDavid van Moolenbroek Get the event_base associated with an event. 1017e985b929SDavid van Moolenbroek */ 1018e985b929SDavid van Moolenbroek struct event_base *event_get_base(const struct event *ev); 1019e985b929SDavid van Moolenbroek 1020e985b929SDavid van Moolenbroek /** 1021e985b929SDavid van Moolenbroek Return the events (EV_READ, EV_WRITE, etc) assigned to an event. 1022e985b929SDavid van Moolenbroek */ 1023e985b929SDavid van Moolenbroek short event_get_events(const struct event *ev); 1024e985b929SDavid van Moolenbroek 1025e985b929SDavid van Moolenbroek /** 1026e985b929SDavid van Moolenbroek Return the callback assigned to an event. 1027e985b929SDavid van Moolenbroek */ 1028e985b929SDavid van Moolenbroek event_callback_fn event_get_callback(const struct event *ev); 1029e985b929SDavid van Moolenbroek 1030e985b929SDavid van Moolenbroek /** 1031e985b929SDavid van Moolenbroek Return the callback argument assigned to an event. 1032e985b929SDavid van Moolenbroek */ 1033e985b929SDavid van Moolenbroek void *event_get_callback_arg(const struct event *ev); 1034e985b929SDavid van Moolenbroek 1035e985b929SDavid van Moolenbroek /** 1036e985b929SDavid van Moolenbroek Extract _all_ of arguments given to construct a given event. The 1037e985b929SDavid van Moolenbroek event_base is copied into *base_out, the fd is copied into *fd_out, and so 1038e985b929SDavid van Moolenbroek on. 1039e985b929SDavid van Moolenbroek 1040e985b929SDavid van Moolenbroek If any of the "_out" arguments is NULL, it will be ignored. 1041e985b929SDavid van Moolenbroek */ 1042e985b929SDavid van Moolenbroek void event_get_assignment(const struct event *event, 1043e985b929SDavid van Moolenbroek struct event_base **base_out, evutil_socket_t *fd_out, short *events_out, 1044e985b929SDavid van Moolenbroek event_callback_fn *callback_out, void **arg_out); 1045e985b929SDavid van Moolenbroek 1046e985b929SDavid van Moolenbroek /** 1047e985b929SDavid van Moolenbroek Return the size of struct event that the Libevent library was compiled 1048e985b929SDavid van Moolenbroek with. 1049e985b929SDavid van Moolenbroek 1050e985b929SDavid van Moolenbroek This will be NO GREATER than sizeof(struct event) if you're running with 1051e985b929SDavid van Moolenbroek the same version of Libevent that your application was built with, but 1052e985b929SDavid van Moolenbroek otherwise might not. 1053e985b929SDavid van Moolenbroek 1054e985b929SDavid van Moolenbroek Note that it might be SMALLER than sizeof(struct event) if some future 1055e985b929SDavid van Moolenbroek version of Libevent adds extra padding to the end of struct event. 1056e985b929SDavid van Moolenbroek We might do this to help ensure ABI-compatibility between different 1057e985b929SDavid van Moolenbroek versions of Libevent. 1058e985b929SDavid van Moolenbroek */ 1059e985b929SDavid van Moolenbroek size_t event_get_struct_event_size(void); 1060e985b929SDavid van Moolenbroek 1061e985b929SDavid van Moolenbroek /** 1062e985b929SDavid van Moolenbroek Get the Libevent version. 1063e985b929SDavid van Moolenbroek 1064e985b929SDavid van Moolenbroek Note that this will give you the version of the library that you're 1065e985b929SDavid van Moolenbroek currently linked against, not the version of the headers that you've 1066e985b929SDavid van Moolenbroek compiled against. 1067e985b929SDavid van Moolenbroek 1068e985b929SDavid van Moolenbroek @return a string containing the version number of Libevent 1069e985b929SDavid van Moolenbroek */ 1070e985b929SDavid van Moolenbroek const char *event_get_version(void); 1071e985b929SDavid van Moolenbroek 1072e985b929SDavid van Moolenbroek /** 1073e985b929SDavid van Moolenbroek Return a numeric representation of Libevent's version. 1074e985b929SDavid van Moolenbroek 1075e985b929SDavid van Moolenbroek Note that this will give you the version of the library that you're 1076e985b929SDavid van Moolenbroek currently linked against, not the version of the headers you've used to 1077e985b929SDavid van Moolenbroek compile. 1078e985b929SDavid van Moolenbroek 1079e985b929SDavid van Moolenbroek The format uses one byte each for the major, minor, and patchlevel parts of 1080e985b929SDavid van Moolenbroek the version number. The low-order byte is unused. For example, version 1081e985b929SDavid van Moolenbroek 2.0.1-alpha has a numeric representation of 0x02000100 1082e985b929SDavid van Moolenbroek */ 1083e985b929SDavid van Moolenbroek ev_uint32_t event_get_version_number(void); 1084e985b929SDavid van Moolenbroek 1085e985b929SDavid van Moolenbroek /** As event_get_version, but gives the version of Libevent's headers. */ 1086e985b929SDavid van Moolenbroek #define LIBEVENT_VERSION _EVENT_VERSION 1087e985b929SDavid van Moolenbroek /** As event_get_version_number, but gives the version number of Libevent's 1088e985b929SDavid van Moolenbroek * headers. */ 1089e985b929SDavid van Moolenbroek #define LIBEVENT_VERSION_NUMBER _EVENT_NUMERIC_VERSION 1090e985b929SDavid van Moolenbroek 1091e985b929SDavid van Moolenbroek /** Largest number of priorities that Libevent can support. */ 1092e985b929SDavid van Moolenbroek #define EVENT_MAX_PRIORITIES 256 1093e985b929SDavid van Moolenbroek /** 1094e985b929SDavid van Moolenbroek Set the number of different event priorities 1095e985b929SDavid van Moolenbroek 1096e985b929SDavid van Moolenbroek By default Libevent schedules all active events with the same priority. 1097e985b929SDavid van Moolenbroek However, some time it is desirable to process some events with a higher 1098e985b929SDavid van Moolenbroek priority than others. For that reason, Libevent supports strict priority 1099e985b929SDavid van Moolenbroek queues. Active events with a lower priority are always processed before 1100e985b929SDavid van Moolenbroek events with a higher priority. 1101e985b929SDavid van Moolenbroek 1102e985b929SDavid van Moolenbroek The number of different priorities can be set initially with the 1103e985b929SDavid van Moolenbroek event_base_priority_init() function. This function should be called 1104e985b929SDavid van Moolenbroek before the first call to event_base_dispatch(). The 1105e985b929SDavid van Moolenbroek event_priority_set() function can be used to assign a priority to an 1106e985b929SDavid van Moolenbroek event. By default, Libevent assigns the middle priority to all events 1107e985b929SDavid van Moolenbroek unless their priority is explicitly set. 1108e985b929SDavid van Moolenbroek 1109e985b929SDavid van Moolenbroek Note that urgent-priority events can starve less-urgent events: after 1110e985b929SDavid van Moolenbroek running all urgent-priority callbacks, Libevent checks for more urgent 1111e985b929SDavid van Moolenbroek events again, before running less-urgent events. Less-urgent events 1112e985b929SDavid van Moolenbroek will not have their callbacks run until there are no events more urgent 1113e985b929SDavid van Moolenbroek than them that want to be active. 1114e985b929SDavid van Moolenbroek 1115e985b929SDavid van Moolenbroek @param eb the event_base structure returned by event_base_new() 1116e985b929SDavid van Moolenbroek @param npriorities the maximum number of priorities 1117e985b929SDavid van Moolenbroek @return 0 if successful, or -1 if an error occurred 1118e985b929SDavid van Moolenbroek @see event_priority_set() 1119e985b929SDavid van Moolenbroek */ 1120e985b929SDavid van Moolenbroek int event_base_priority_init(struct event_base *, int); 1121e985b929SDavid van Moolenbroek 1122e985b929SDavid van Moolenbroek /** 1123e985b929SDavid van Moolenbroek Assign a priority to an event. 1124e985b929SDavid van Moolenbroek 1125e985b929SDavid van Moolenbroek @param ev an event struct 1126e985b929SDavid van Moolenbroek @param priority the new priority to be assigned 1127e985b929SDavid van Moolenbroek @return 0 if successful, or -1 if an error occurred 1128e985b929SDavid van Moolenbroek @see event_priority_init() 1129e985b929SDavid van Moolenbroek */ 1130e985b929SDavid van Moolenbroek int event_priority_set(struct event *, int); 1131e985b929SDavid van Moolenbroek 1132e985b929SDavid van Moolenbroek /** 1133e985b929SDavid van Moolenbroek Prepare an event_base to use a large number of timeouts with the same 1134e985b929SDavid van Moolenbroek duration. 1135e985b929SDavid van Moolenbroek 1136e985b929SDavid van Moolenbroek Libevent's default scheduling algorithm is optimized for having a large 1137e985b929SDavid van Moolenbroek number of timeouts with their durations more or less randomly 1138e985b929SDavid van Moolenbroek distributed. But if you have a large number of timeouts that all have 1139e985b929SDavid van Moolenbroek the same duration (for example, if you have a large number of 1140e985b929SDavid van Moolenbroek connections that all have a 10-second timeout), then you can improve 1141e985b929SDavid van Moolenbroek Libevent's performance by telling Libevent about it. 1142e985b929SDavid van Moolenbroek 1143e985b929SDavid van Moolenbroek To do this, call this function with the common duration. It will return a 1144e985b929SDavid van Moolenbroek pointer to a different, opaque timeout value. (Don't depend on its actual 1145e985b929SDavid van Moolenbroek contents!) When you use this timeout value in event_add(), Libevent will 1146e985b929SDavid van Moolenbroek schedule the event more efficiently. 1147e985b929SDavid van Moolenbroek 1148e985b929SDavid van Moolenbroek (This optimization probably will not be worthwhile until you have thousands 1149e985b929SDavid van Moolenbroek or tens of thousands of events with the same timeout.) 1150e985b929SDavid van Moolenbroek */ 1151e985b929SDavid van Moolenbroek const struct timeval *event_base_init_common_timeout(struct event_base *base, 1152e985b929SDavid van Moolenbroek const struct timeval *duration); 1153e985b929SDavid van Moolenbroek 1154e985b929SDavid van Moolenbroek #if !defined(_EVENT_DISABLE_MM_REPLACEMENT) || defined(_EVENT_IN_DOXYGEN) 1155e985b929SDavid van Moolenbroek /** 1156e985b929SDavid van Moolenbroek Override the functions that Libevent uses for memory management. 1157e985b929SDavid van Moolenbroek 1158e985b929SDavid van Moolenbroek Usually, Libevent uses the standard libc functions malloc, realloc, and 1159e985b929SDavid van Moolenbroek free to allocate memory. Passing replacements for those functions to 1160e985b929SDavid van Moolenbroek event_set_mem_functions() overrides this behavior. 1161e985b929SDavid van Moolenbroek 1162e985b929SDavid van Moolenbroek Note that all memory returned from Libevent will be allocated by the 1163e985b929SDavid van Moolenbroek replacement functions rather than by malloc() and realloc(). Thus, if you 1164e985b929SDavid van Moolenbroek have replaced those functions, it will not be appropriate to free() memory 1165e985b929SDavid van Moolenbroek that you get from Libevent. Instead, you must use the free_fn replacement 1166e985b929SDavid van Moolenbroek that you provided. 1167e985b929SDavid van Moolenbroek 1168e985b929SDavid van Moolenbroek Note also that if you are going to call this function, you should do so 1169e985b929SDavid van Moolenbroek before any call to any Libevent function that does allocation. 1170e985b929SDavid van Moolenbroek Otherwise, those funtions will allocate their memory using malloc(), but 1171e985b929SDavid van Moolenbroek then later free it using your provided free_fn. 1172e985b929SDavid van Moolenbroek 1173e985b929SDavid van Moolenbroek @param malloc_fn A replacement for malloc. 1174e985b929SDavid van Moolenbroek @param realloc_fn A replacement for realloc 1175e985b929SDavid van Moolenbroek @param free_fn A replacement for free. 1176e985b929SDavid van Moolenbroek **/ 1177e985b929SDavid van Moolenbroek void event_set_mem_functions( 1178e985b929SDavid van Moolenbroek void *(*malloc_fn)(size_t sz), 1179e985b929SDavid van Moolenbroek void *(*realloc_fn)(void *ptr, size_t sz), 1180e985b929SDavid van Moolenbroek void (*free_fn)(void *ptr)); 1181e985b929SDavid van Moolenbroek /** This definition is present if Libevent was built with support for 1182e985b929SDavid van Moolenbroek event_set_mem_functions() */ 1183e985b929SDavid van Moolenbroek #define EVENT_SET_MEM_FUNCTIONS_IMPLEMENTED 1184e985b929SDavid van Moolenbroek #endif 1185e985b929SDavid van Moolenbroek 1186e985b929SDavid van Moolenbroek void event_base_dump_events(struct event_base *, FILE *); 1187e985b929SDavid van Moolenbroek 1188e985b929SDavid van Moolenbroek /** Sets 'tv' to the current time (as returned by gettimeofday()), 1189e985b929SDavid van Moolenbroek looking at the cached value in 'base' if possible, and calling 1190e985b929SDavid van Moolenbroek gettimeofday() or clock_gettime() as appropriate if there is no 1191e985b929SDavid van Moolenbroek cached time. 1192e985b929SDavid van Moolenbroek 1193e985b929SDavid van Moolenbroek Generally, this value will only be cached while actually 1194e985b929SDavid van Moolenbroek processing event callbacks, and may be very inaccuate if your 1195e985b929SDavid van Moolenbroek callbacks take a long time to execute. 1196e985b929SDavid van Moolenbroek 1197e985b929SDavid van Moolenbroek Returns 0 on success, negative on failure. 1198e985b929SDavid van Moolenbroek */ 1199e985b929SDavid van Moolenbroek int event_base_gettimeofday_cached(struct event_base *base, 1200e985b929SDavid van Moolenbroek struct timeval *tv); 1201e985b929SDavid van Moolenbroek 1202e985b929SDavid van Moolenbroek #ifdef __cplusplus 1203e985b929SDavid van Moolenbroek } 1204e985b929SDavid van Moolenbroek #endif 1205e985b929SDavid van Moolenbroek 1206e985b929SDavid van Moolenbroek #endif /* _EVENT2_EVENT_H_ */ 1207