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