xref: /minix3/external/bsd/libevent/dist/include/event2/event.h (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
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