1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672 |
- /*
- * Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
- * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- #ifndef EVENT2_EVENT_H_INCLUDED_
- #define EVENT2_EVENT_H_INCLUDED_
- /**
- @mainpage
- @section intro Introduction
- Libevent is an event notification library for developing scalable network
- servers. The Libevent API provides a mechanism to execute a callback
- function when a specific event occurs on a file descriptor or after a
- timeout has been reached. Furthermore, Libevent also support callbacks due
- to signals or regular timeouts.
- Libevent is meant to replace the event loop found in event driven network
- servers. An application just needs to call event_base_dispatch() and then add or
- remove events dynamically without having to change the event loop.
- Currently, Libevent supports /dev/poll, kqueue(2), select(2), poll(2),
- epoll(4), and evports. The internal event mechanism is completely
- independent of the exposed event API, and a simple update of Libevent can
- provide new functionality without having to redesign the applications. As a
- result, Libevent allows for portable application development and provides
- the most scalable event notification mechanism available on an operating
- system. Libevent can also be used for multithreaded programs. Libevent
- should compile on Linux, *BSD, Mac OS X, Solaris and, Windows.
- @section usage Standard usage
- Every program that uses Libevent must include the <event2/event.h>
- header, and pass the -levent flag to the linker. (You can instead link
- -levent_core if you only want the main event and buffered IO-based code,
- and don't want to link any protocol code.)
- @section setup Library setup
- Before you call any other Libevent functions, you need to set up the
- library. If you're going to use Libevent from multiple threads in a
- multithreaded application, you need to initialize thread support --
- typically by using evthread_use_pthreads() or
- evthread_use_windows_threads(). See <event2/thread.h> for more
- information.
- This is also the point where you can replace Libevent's memory
- management functions with event_set_mem_functions, and enable debug mode
- with event_enable_debug_mode().
- @section base Creating an event base
- Next, you need to create an event_base structure, using event_base_new()
- or event_base_new_with_config(). The event_base is responsible for
- keeping track of which events are "pending" (that is to say, being
- watched to see if they become active) and which events are "active".
- Every event is associated with a single event_base.
- @section event Event notification
- For each file descriptor that you wish to monitor, you must create an
- event structure with event_new(). (You may also declare an event
- structure and call event_assign() to initialize the members of the
- structure.) To enable notification, you add the structure to the list
- of monitored events by calling event_add(). The event structure must
- remain allocated as long as it is active, so it should generally be
- allocated on the heap.
- @section loop Dispatching events.
- Finally, you call event_base_dispatch() to loop and dispatch events.
- You can also use event_base_loop() for more fine-grained control.
- Currently, only one thread can be dispatching a given event_base at a
- time. If you want to run events in multiple threads at once, you can
- either have a single event_base whose events add work to a work queue,
- or you can create multiple event_base objects.
- @section bufferevent I/O Buffers
- Libevent provides a buffered I/O abstraction on top of the regular event
- callbacks. This abstraction is called a bufferevent. A bufferevent
- provides input and output buffers that get filled and drained
- automatically. The user of a buffered event no longer deals directly
- with the I/O, but instead is reading from input and writing to output
- buffers.
- Once initialized via bufferevent_socket_new(), the bufferevent structure
- can be used repeatedly with bufferevent_enable() and
- bufferevent_disable(). Instead of reading and writing directly to a
- socket, you would call bufferevent_read() and bufferevent_write().
- When read enabled the bufferevent will try to read from the file descriptor
- and call the read callback. The write callback is executed whenever the
- output buffer is drained below the write low watermark, which is 0 by
- default.
- See <event2/bufferevent*.h> for more information.
- @section timers Timers
- Libevent can also be used to create timers that invoke a callback after a
- certain amount of time has expired. The evtimer_new() macro returns
- an event struct to use as a timer. To activate the timer, call
- evtimer_add(). Timers can be deactivated by calling evtimer_del().
- (These macros are thin wrappers around event_new(), event_add(),
- and event_del(); you can also use those instead.)
- @section evdns Asynchronous DNS resolution
- Libevent provides an asynchronous DNS resolver that should be used instead
- of the standard DNS resolver functions. See the <event2/dns.h>
- functions for more detail.
- @section evhttp Event-driven HTTP servers
- Libevent provides a very simple event-driven HTTP server that can be
- embedded in your program and used to service HTTP requests.
- To use this capability, you need to include the <event2/http.h> header in your
- program. See that header for more information.
- @section evrpc A framework for RPC servers and clients
- Libevent provides a framework for creating RPC servers and clients. It
- takes care of marshaling and unmarshaling all data structures.
- @section api API Reference
- To browse the complete documentation of the libevent API, click on any of
- the following links.
- event2/event.h
- The primary libevent header
- event2/thread.h
- Functions for use by multithreaded programs
- event2/buffer.h and event2/bufferevent.h
- Buffer management for network reading and writing
- event2/util.h
- Utility functions for portable nonblocking network code
- event2/dns.h
- Asynchronous DNS resolution
- event2/http.h
- An embedded libevent-based HTTP server
- event2/rpc.h
- A framework for creating RPC servers and clients
- */
- /** @file event2/event.h
- Core functions for waiting for and receiving events, and using event bases.
- */
- #include <event2/visibility.h>
- #ifdef __cplusplus
- extern "C" {
- #endif
- #include <event2/event-config.h>
- #ifdef EVENT__HAVE_SYS_TYPES_H
- #include <sys/types.h>
- #endif
- #ifdef EVENT__HAVE_SYS_TIME_H
- #include <sys/time.h>
- #endif
- #include <stdio.h>
- /* For int types. */
- #include <event2/util.h>
- /**
- * Structure to hold information and state for a Libevent dispatch loop.
- *
- * The event_base lies at the center of Libevent; every application will
- * have one. It keeps track of all pending and active events, and
- * notifies your application of the active ones.
- *
- * This is an opaque structure; you can allocate one using
- * event_base_new() or event_base_new_with_config().
- *
- * @see event_base_new(), event_base_free(), event_base_loop(),
- * event_base_new_with_config()
- */
- struct event_base
- #ifdef EVENT_IN_DOXYGEN_
- {/*Empty body so that doxygen will generate documentation here.*/}
- #endif
- ;
- /**
- * @struct event
- *
- * Structure to represent a single event.
- *
- * An event can have some underlying condition it represents: a socket
- * becoming readable or writeable (or both), or a signal becoming raised.
- * (An event that represents no underlying condition is still useful: you
- * can use one to implement a timer, or to communicate between threads.)
- *
- * Generally, you can create events with event_new(), then make them
- * pending with event_add(). As your event_base runs, it will run the
- * callbacks of an events whose conditions are triggered. When you no
- * longer want the event, free it with event_free().
- *
- * In more depth:
- *
- * An event may be "pending" (one whose condition we are watching),
- * "active" (one whose condition has triggered and whose callback is about
- * to run), neither, or both. Events come into existence via
- * event_assign() or event_new(), and are then neither active nor pending.
- *
- * To make an event pending, pass it to event_add(). When doing so, you
- * can also set a timeout for the event.
- *
- * Events become active during an event_base_loop() call when either their
- * condition has triggered, or when their timeout has elapsed. You can
- * also activate an event manually using event_active(). The even_base
- * loop will run the callbacks of active events; after it has done so, it
- * marks them as no longer active.
- *
- * You can make an event non-pending by passing it to event_del(). This
- * also makes the event non-active.
- *
- * Events can be "persistent" or "non-persistent". A non-persistent event
- * becomes non-pending as soon as it is triggered: thus, it only runs at
- * most once per call to event_add(). A persistent event remains pending
- * even when it becomes active: you'll need to event_del() it manually in
- * order to make it non-pending. When a persistent event with a timeout
- * becomes active, its timeout is reset: this means you can use persistent
- * events to implement periodic timeouts.
- *
- * This should be treated as an opaque structure; you should never read or
- * write any of its fields directly. For backward compatibility with old
- * code, it is defined in the event2/event_struct.h header; including this
- * header may make your code incompatible with other versions of Libevent.
- *
- * @see event_new(), event_free(), event_assign(), event_get_assignment(),
- * event_add(), event_del(), event_active(), event_pending(),
- * event_get_fd(), event_get_base(), event_get_events(),
- * event_get_callback(), event_get_callback_arg(),
- * event_priority_set()
- */
- struct event
- #ifdef EVENT_IN_DOXYGEN_
- {/*Empty body so that doxygen will generate documentation here.*/}
- #endif
- ;
- /**
- * Configuration for an event_base.
- *
- * There are many options that can be used to alter the behavior and
- * implementation of an event_base. To avoid having to pass them all in a
- * complex many-argument constructor, we provide an abstract data type
- * where you set up configuration information before passing it to
- * event_base_new_with_config().
- *
- * @see event_config_new(), event_config_free(), event_base_new_with_config(),
- * event_config_avoid_method(), event_config_require_features(),
- * event_config_set_flag(), event_config_set_num_cpus_hint()
- */
- struct event_config
- #ifdef EVENT_IN_DOXYGEN_
- {/*Empty body so that doxygen will generate documentation here.*/}
- #endif
- ;
- /**
- * Enable some relatively expensive debugging checks in Libevent that
- * would normally be turned off. Generally, these checks cause code that
- * would otherwise crash mysteriously to fail earlier with an assertion
- * failure. Note that this method MUST be called before any events or
- * event_bases have been created.
- *
- * Debug mode can currently catch the following errors:
- * An event is re-assigned while it is added
- * Any function is called on a non-assigned event
- *
- * Note that debugging mode uses memory to track every event that has been
- * initialized (via event_assign, event_set, or event_new) but not yet
- * released (via event_free or event_debug_unassign). If you want to use
- * debug mode, and you find yourself running out of memory, you will need
- * to use event_debug_unassign to explicitly stop tracking events that
- * are no longer considered set-up.
- *
- * @see event_debug_unassign()
- */
- EVENT2_EXPORT_SYMBOL
- void event_enable_debug_mode(void);
- /**
- * When debugging mode is enabled, informs Libevent that an event should no
- * longer be considered as assigned. When debugging mode is not enabled, does
- * nothing.
- *
- * This function must only be called on a non-added event.
- *
- * @see event_enable_debug_mode()
- */
- EVENT2_EXPORT_SYMBOL
- void event_debug_unassign(struct event *);
- /**
- * Create and return a new event_base to use with the rest of Libevent.
- *
- * @return a new event_base on success, or NULL on failure.
- *
- * @see event_base_free(), event_base_new_with_config()
- */
- EVENT2_EXPORT_SYMBOL
- struct event_base *event_base_new(void);
- /**
- Reinitialize the event base after a fork
- Some event mechanisms do not survive across fork. The event base needs
- to be reinitialized with the event_reinit() function.
- @param base the event base that needs to be re-initialized
- @return 0 if successful, or -1 if some events could not be re-added.
- @see event_base_new()
- */
- EVENT2_EXPORT_SYMBOL
- int event_reinit(struct event_base *base);
- /**
- Event dispatching loop
- This loop will run the event base until either there are no more pending or
- active, or until something calls event_base_loopbreak() or
- event_base_loopexit().
- @param base the event_base structure returned by event_base_new() or
- event_base_new_with_config()
- @return 0 if successful, -1 if an error occurred, or 1 if we exited because
- no events were pending or active.
- @see event_base_loop()
- */
- EVENT2_EXPORT_SYMBOL
- int event_base_dispatch(struct event_base *);
- /**
- Get the kernel event notification mechanism used by Libevent.
- @param eb the event_base structure returned by event_base_new()
- @return a string identifying the kernel event mechanism (kqueue, epoll, etc.)
- */
- EVENT2_EXPORT_SYMBOL
- const char *event_base_get_method(const struct event_base *);
- /**
- Gets all event notification mechanisms supported by Libevent.
- This functions returns the event mechanism in order preferred by
- Libevent. Note that this list will include all backends that
- Libevent has compiled-in support for, and will not necessarily check
- your OS to see whether it has the required resources.
- @return an array with pointers to the names of support methods.
- The end of the array is indicated by a NULL pointer. If an
- error is encountered NULL is returned.
- */
- EVENT2_EXPORT_SYMBOL
- const char **event_get_supported_methods(void);
- /** Query the current monotonic time from a the timer for a struct
- * event_base.
- */
- EVENT2_EXPORT_SYMBOL
- int event_gettime_monotonic(struct event_base *base, struct timeval *tp);
- /**
- @name event type flag
- Flags to pass to event_base_get_num_events() to specify the kinds of events
- we want to aggregate counts for
- */
- /**@{*/
- /** count the number of active events, which have been triggered.*/
- #define EVENT_BASE_COUNT_ACTIVE 1U
- /** count the number of virtual events, which is used to represent an internal
- * condition, other than a pending event, that keeps the loop from exiting. */
- #define EVENT_BASE_COUNT_VIRTUAL 2U
- /** count the number of events which have been added to event base, including
- * internal events. */
- #define EVENT_BASE_COUNT_ADDED 4U
- /**@}*/
- /**
- Gets the number of events in event_base, as specified in the flags.
- Since event base has some internal events added to make some of its
- functionalities work, EVENT_BASE_COUNT_ADDED may return more than the
- number of events you added using event_add().
- If you pass EVENT_BASE_COUNT_ACTIVE and EVENT_BASE_COUNT_ADDED together, an
- active event will be counted twice. However, this might not be the case in
- future libevent versions. The return value is an indication of the work
- load, but the user shouldn't rely on the exact value as this may change in
- the future.
- @param eb the event_base structure returned by event_base_new()
- @param flags a bitwise combination of the kinds of events to aggregate
- counts for
- @return the number of events specified in the flags
- */
- EVENT2_EXPORT_SYMBOL
- int event_base_get_num_events(struct event_base *, unsigned int);
- /**
- Get the maximum number of events in a given event_base as specified in the
- flags.
- @param eb the event_base structure returned by event_base_new()
- @param flags a bitwise combination of the kinds of events to aggregate
- counts for
- @param clear option used to reset the maximum count.
- @return the number of events specified in the flags
- */
- EVENT2_EXPORT_SYMBOL
- int event_base_get_max_events(struct event_base *, unsigned int, int);
- /**
- Allocates a new event configuration object.
- The event configuration object can be used to change the behavior of
- an event base.
- @return an event_config object that can be used to store configuration, or
- NULL if an error is encountered.
- @see event_base_new_with_config(), event_config_free(), event_config
- */
- EVENT2_EXPORT_SYMBOL
- struct event_config *event_config_new(void);
- /**
- Deallocates all memory associated with an event configuration object
- @param cfg the event configuration object to be freed.
- */
- EVENT2_EXPORT_SYMBOL
- void event_config_free(struct event_config *cfg);
- /**
- Enters an event method that should be avoided into the configuration.
- This can be used to avoid event mechanisms that do not support certain
- file descriptor types, or for debugging to avoid certain event
- mechanisms. An application can make use of multiple event bases to
- accommodate incompatible file descriptor types.
- @param cfg the event configuration object
- @param method the name of the event method to avoid
- @return 0 on success, -1 on failure.
- */
- EVENT2_EXPORT_SYMBOL
- int event_config_avoid_method(struct event_config *cfg, const char *method);
- /**
- A flag used to describe which features an event_base (must) provide.
- Because of OS limitations, not every Libevent backend supports every
- possible feature. You can use this type with
- event_config_require_features() to tell Libevent to only proceed if your
- event_base implements a given feature, and you can receive this type from
- event_base_get_features() to see which features are available.
- */
- enum event_method_feature {
- /** Require an event method that allows edge-triggered events with EV_ET. */
- EV_FEATURE_ET = 0x01,
- /** Require an event method where having one event triggered among
- * many is [approximately] an O(1) operation. This excludes (for
- * example) select and poll, which are approximately O(N) for N
- * equal to the total number of possible events. */
- EV_FEATURE_O1 = 0x02,
- /** Require an event method that allows file descriptors as well as
- * sockets. */
- EV_FEATURE_FDS = 0x04,
- /** Require an event method that allows you to use EV_CLOSED to detect
- * connection close without the necessity of reading all the pending data.
- *
- * Methods that do support EV_CLOSED may not be able to provide support on
- * all kernel versions.
- **/
- EV_FEATURE_EARLY_CLOSE = 0x08
- };
- /**
- A flag passed to event_config_set_flag().
- These flags change the behavior of an allocated event_base.
- @see event_config_set_flag(), event_base_new_with_config(),
- event_method_feature
- */
- enum event_base_config_flag {
- /** Do not allocate a lock for the event base, even if we have
- locking set up.
- Setting this option will make it unsafe and nonfunctional to call
- functions on the base concurrently from multiple threads.
- */
- EVENT_BASE_FLAG_NOLOCK = 0x01,
- /** Do not check the EVENT_* environment variables when configuring
- an event_base */
- EVENT_BASE_FLAG_IGNORE_ENV = 0x02,
- /** Windows only: enable the IOCP dispatcher at startup
- If this flag is set then bufferevent_socket_new() and
- evconn_listener_new() will use IOCP-backed implementations
- instead of the usual select-based one on Windows.
- */
- EVENT_BASE_FLAG_STARTUP_IOCP = 0x04,
- /** Instead of checking the current time every time the event loop is
- ready to run timeout callbacks, check after each timeout callback.
- */
- EVENT_BASE_FLAG_NO_CACHE_TIME = 0x08,
- /** If we are using the epoll backend, this flag says that it is
- safe to use Libevent's internal change-list code to batch up
- adds and deletes in order to try to do as few syscalls as
- possible. Setting this flag can make your code run faster, but
- it may trigger a Linux bug: it is not safe to use this flag
- if you have any fds cloned by dup() or its variants. Doing so
- will produce strange and hard-to-diagnose bugs.
- This flag can also be activated by setting the
- EVENT_EPOLL_USE_CHANGELIST environment variable.
- This flag has no effect if you wind up using a backend other than
- epoll.
- */
- EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST = 0x10,
- /** Ordinarily, Libevent implements its time and timeout code using
- the fastest monotonic timer that we have. If this flag is set,
- however, we use less efficient more precise timer, assuming one is
- present.
- */
- EVENT_BASE_FLAG_PRECISE_TIMER = 0x20
- };
- /**
- Return a bitmask of the features implemented by an event base. This
- will be a bitwise OR of one or more of the values of
- event_method_feature
- @see event_method_feature
- */
- EVENT2_EXPORT_SYMBOL
- int event_base_get_features(const struct event_base *base);
- /**
- Enters a required event method feature that the application demands.
- Note that not every feature or combination of features is supported
- on every platform. Code that requests features should be prepared
- to handle the case where event_base_new_with_config() returns NULL, as in:
- <pre>
- event_config_require_features(cfg, EV_FEATURE_ET);
- base = event_base_new_with_config(cfg);
- if (base == NULL) {
- // We can't get edge-triggered behavior here.
- event_config_require_features(cfg, 0);
- base = event_base_new_with_config(cfg);
- }
- </pre>
- @param cfg the event configuration object
- @param feature a bitfield of one or more event_method_feature values.
- Replaces values from previous calls to this function.
- @return 0 on success, -1 on failure.
- @see event_method_feature, event_base_new_with_config()
- */
- EVENT2_EXPORT_SYMBOL
- int event_config_require_features(struct event_config *cfg, int feature);
- /**
- * Sets one or more flags to configure what parts of the eventual event_base
- * will be initialized, and how they'll work.
- *
- * @see event_base_config_flags, event_base_new_with_config()
- **/
- EVENT2_EXPORT_SYMBOL
- int event_config_set_flag(struct event_config *cfg, int flag);
- /**
- * Records a hint for the number of CPUs in the system. This is used for
- * tuning thread pools, etc, for optimal performance. In Libevent 2.0,
- * it is only on Windows, and only when IOCP is in use.
- *
- * @param cfg the event configuration object
- * @param cpus the number of cpus
- * @return 0 on success, -1 on failure.
- */
- EVENT2_EXPORT_SYMBOL
- int event_config_set_num_cpus_hint(struct event_config *cfg, int cpus);
- /**
- * Record an interval and/or a number of callbacks after which the event base
- * should check for new events. By default, the event base will run as many
- * events are as activated at the highest activated priority before checking
- * for new events. If you configure it by setting max_interval, it will check
- * the time after each callback, and not allow more than max_interval to
- * elapse before checking for new events. If you configure it by setting
- * max_callbacks to a value >= 0, it will run no more than max_callbacks
- * callbacks before checking for new events.
- *
- * This option can decrease the latency of high-priority events, and
- * avoid priority inversions where multiple low-priority events keep us from
- * polling for high-priority events, but at the expense of slightly decreasing
- * the throughput. Use it with caution!
- *
- * @param cfg The event_base configuration object.
- * @param max_interval An interval after which Libevent should stop running
- * callbacks and check for more events, or NULL if there should be
- * no such interval.
- * @param max_callbacks A number of callbacks after which Libevent should
- * stop running callbacks and check for more events, or -1 if there
- * should be no such limit.
- * @param min_priority A priority below which max_interval and max_callbacks
- * should not be enforced. If this is set to 0, they are enforced
- * for events of every priority; if it's set to 1, they're enforced
- * for events of priority 1 and above, and so on.
- * @return 0 on success, -1 on failure.
- **/
- EVENT2_EXPORT_SYMBOL
- int event_config_set_max_dispatch_interval(struct event_config *cfg,
- const struct timeval *max_interval, int max_callbacks,
- int min_priority);
- /**
- Initialize the event API.
- Use event_base_new_with_config() to initialize a new event base, taking
- the specified configuration under consideration. The configuration object
- can currently be used to avoid certain event notification mechanisms.
- @param cfg the event configuration object
- @return an initialized event_base that can be used to registering events,
- or NULL if no event base can be created with the requested event_config.
- @see event_base_new(), event_base_free(), event_init(), event_assign()
- */
- EVENT2_EXPORT_SYMBOL
- struct event_base *event_base_new_with_config(const struct event_config *);
- /**
- Deallocate all memory associated with an event_base, and free the base.
- Note that this function will not close any fds or free any memory passed
- to event_new as the argument to callback.
- If there are any pending finalizer callbacks, this function will invoke
- them.
- @param eb an event_base to be freed
- */
- EVENT2_EXPORT_SYMBOL
- void event_base_free(struct event_base *);
- /**
- As event_base_free, but do not run finalizers.
- */
- EVENT2_EXPORT_SYMBOL
- void event_base_free_nofinalize(struct event_base *);
- /** @name Log severities
- */
- /**@{*/
- #define EVENT_LOG_DEBUG 0
- #define EVENT_LOG_MSG 1
- #define EVENT_LOG_WARN 2
- #define EVENT_LOG_ERR 3
- /**@}*/
- /* Obsolete names: these are deprecated, but older programs might use them.
- * They violate the reserved-identifier namespace. */
- #define _EVENT_LOG_DEBUG EVENT_LOG_DEBUG
- #define _EVENT_LOG_MSG EVENT_LOG_MSG
- #define _EVENT_LOG_WARN EVENT_LOG_WARN
- #define _EVENT_LOG_ERR EVENT_LOG_ERR
- /**
- A callback function used to intercept Libevent's log messages.
- @see event_set_log_callback
- */
- typedef void (*event_log_cb)(int severity, const char *msg);
- /**
- Redirect Libevent's log messages.
- @param cb a function taking two arguments: an integer severity between
- EVENT_LOG_DEBUG and EVENT_LOG_ERR, and a string. If cb is NULL,
- then the default log is used.
- NOTE: The function you provide *must not* call any other libevent
- functionality. Doing so can produce undefined behavior.
- */
- EVENT2_EXPORT_SYMBOL
- void event_set_log_callback(event_log_cb cb);
- /**
- A function to be called if Libevent encounters a fatal internal error.
- @see event_set_fatal_callback
- */
- typedef void (*event_fatal_cb)(int err);
- /**
- Override Libevent's behavior in the event of a fatal internal error.
- By default, Libevent will call exit(1) if a programming error makes it
- impossible to continue correct operation. This function allows you to supply
- another callback instead. Note that if the function is ever invoked,
- something is wrong with your program, or with Libevent: any subsequent calls
- to Libevent may result in undefined behavior.
- Libevent will (almost) always log an EVENT_LOG_ERR message before calling
- this function; look at the last log message to see why Libevent has died.
- */
- EVENT2_EXPORT_SYMBOL
- void event_set_fatal_callback(event_fatal_cb cb);
- #define EVENT_DBG_ALL 0xffffffffu
- #define EVENT_DBG_NONE 0
- /**
- Turn on debugging logs and have them sent to the default log handler.
- This is a global setting; if you are going to call it, you must call this
- before any calls that create an event-base. You must call it before any
- multithreaded use of Libevent.
- Debug logs are verbose.
- @param which Controls which debug messages are turned on. This option is
- unused for now; for forward compatibility, you must pass in the constant
- "EVENT_DBG_ALL" to turn debugging logs on, or "EVENT_DBG_NONE" to turn
- debugging logs off.
- */
- EVENT2_EXPORT_SYMBOL
- void event_enable_debug_logging(ev_uint32_t which);
- /**
- Associate a different event base with an event.
- The event to be associated must not be currently active or pending.
- @param eb the event base
- @param ev the event
- @return 0 on success, -1 on failure.
- */
- EVENT2_EXPORT_SYMBOL
- int event_base_set(struct event_base *, struct event *);
- /** @name Loop flags
- These flags control the behavior of event_base_loop().
- */
- /**@{*/
- /** Block until we have an active event, then exit once all active events
- * have had their callbacks run. */
- #define EVLOOP_ONCE 0x01
- /** Do not block: see which events are ready now, run the callbacks
- * of the highest-priority ones, then exit. */
- #define EVLOOP_NONBLOCK 0x02
- /** Do not exit the loop because we have no pending events. Instead, keep
- * running until event_base_loopexit() or event_base_loopbreak() makes us
- * stop.
- */
- #define EVLOOP_NO_EXIT_ON_EMPTY 0x04
- /**@}*/
- /**
- Wait for events to become active, and run their callbacks.
- This is a more flexible version of event_base_dispatch().
- By default, this loop will run the event base until either there are no more
- pending or active events, or until something calls event_base_loopbreak() or
- event_base_loopexit(). You can override this behavior with the 'flags'
- argument.
- @param eb the event_base structure returned by event_base_new() or
- event_base_new_with_config()
- @param flags any combination of EVLOOP_ONCE | EVLOOP_NONBLOCK
- @return 0 if successful, -1 if an error occurred, or 1 if we exited because
- no events were pending or active.
- @see event_base_loopexit(), event_base_dispatch(), EVLOOP_ONCE,
- EVLOOP_NONBLOCK
- */
- EVENT2_EXPORT_SYMBOL
- int event_base_loop(struct event_base *, int);
- /**
- Exit the event loop after the specified time
- The next event_base_loop() iteration after the given timer expires will
- complete normally (handling all queued events) then exit without
- blocking for events again.
- Subsequent invocations of event_base_loop() will proceed normally.
- @param eb the event_base structure returned by event_init()
- @param tv the amount of time after which the loop should terminate,
- or NULL to exit after running all currently active events.
- @return 0 if successful, or -1 if an error occurred
- @see event_base_loopbreak()
- */
- EVENT2_EXPORT_SYMBOL
- int event_base_loopexit(struct event_base *, const struct timeval *);
- /**
- Abort the active event_base_loop() immediately.
- event_base_loop() will abort the loop after the next event is completed;
- event_base_loopbreak() is typically invoked from this event's callback.
- This behavior is analogous to the "break;" statement.
- Subsequent invocations of event_base_loop() will proceed normally.
- @param eb the event_base structure returned by event_init()
- @return 0 if successful, or -1 if an error occurred
- @see event_base_loopexit()
- */
- EVENT2_EXPORT_SYMBOL
- int event_base_loopbreak(struct event_base *);
- /**
- Tell the active event_base_loop() to scan for new events immediately.
- Calling this function makes the currently active event_base_loop()
- start the loop over again (scanning for new events) after the current
- event callback finishes. If the event loop is not running, this
- function has no effect.
- event_base_loopbreak() is typically invoked from this event's callback.
- This behavior is analogous to the "continue;" statement.
- Subsequent invocations of event loop will proceed normally.
- @param eb the event_base structure returned by event_init()
- @return 0 if successful, or -1 if an error occurred
- @see event_base_loopbreak()
- */
- EVENT2_EXPORT_SYMBOL
- int event_base_loopcontinue(struct event_base *);
- /**
- Checks if the event loop was told to exit by event_base_loopexit().
- This function will return true for an event_base at every point after
- event_loopexit() is called, until the event loop is next entered.
- @param eb the event_base structure returned by event_init()
- @return true if event_base_loopexit() was called on this event base,
- or 0 otherwise
- @see event_base_loopexit()
- @see event_base_got_break()
- */
- EVENT2_EXPORT_SYMBOL
- int event_base_got_exit(struct event_base *);
- /**
- Checks if the event loop was told to abort immediately by event_base_loopbreak().
- This function will return true for an event_base at every point after
- event_base_loopbreak() is called, until the event loop is next entered.
- @param eb the event_base structure returned by event_init()
- @return true if event_base_loopbreak() was called on this event base,
- or 0 otherwise
- @see event_base_loopbreak()
- @see event_base_got_exit()
- */
- EVENT2_EXPORT_SYMBOL
- int event_base_got_break(struct event_base *);
- /**
- * @name event flags
- *
- * Flags to pass to event_new(), event_assign(), event_pending(), and
- * anything else with an argument of the form "short events"
- */
- /**@{*/
- /** Indicates that a timeout has occurred. It's not necessary to pass
- * this flag to event_for new()/event_assign() to get a timeout. */
- #define EV_TIMEOUT 0x01
- /** Wait for a socket or FD to become readable */
- #define EV_READ 0x02
- /** Wait for a socket or FD to become writeable */
- #define EV_WRITE 0x04
- /** Wait for a POSIX signal to be raised*/
- #define EV_SIGNAL 0x08
- /**
- * Persistent event: won't get removed automatically when activated.
- *
- * When a persistent event with a timeout becomes activated, its timeout
- * is reset to 0.
- */
- #define EV_PERSIST 0x10
- /** Select edge-triggered behavior, if supported by the backend. */
- #define EV_ET 0x20
- /**
- * If this option is provided, then event_del() will not block in one thread
- * while waiting for the event callback to complete in another thread.
- *
- * To use this option safely, you may need to use event_finalize() or
- * event_free_finalize() in order to safely tear down an event in a
- * multithreaded application. See those functions for more information.
- **/
- #define EV_FINALIZE 0x40
- /**
- * Detects connection close events. You can use this to detect when a
- * connection has been closed, without having to read all the pending data
- * from a connection.
- *
- * Not all backends support EV_CLOSED. To detect or require it, use the
- * feature flag EV_FEATURE_EARLY_CLOSE.
- **/
- #define EV_CLOSED 0x80
- /**@}*/
- /**
- @name evtimer_* macros
- Aliases for working with one-shot timer events
- If you need EV_PERSIST timer use event_*() functions.
- */
- /**@{*/
- #define evtimer_assign(ev, b, cb, arg) \
- event_assign((ev), (b), -1, 0, (cb), (arg))
- #define evtimer_new(b, cb, arg) event_new((b), -1, 0, (cb), (arg))
- #define evtimer_add(ev, tv) event_add((ev), (tv))
- #define evtimer_del(ev) event_del(ev)
- #define evtimer_pending(ev, tv) event_pending((ev), EV_TIMEOUT, (tv))
- #define evtimer_initialized(ev) event_initialized(ev)
- /**@}*/
- /**
- @name evsignal_* macros
- Aliases for working with signal events
- */
- /**@{*/
- #define evsignal_add(ev, tv) event_add((ev), (tv))
- #define evsignal_assign(ev, b, x, cb, arg) \
- event_assign((ev), (b), (x), EV_SIGNAL|EV_PERSIST, cb, (arg))
- #define evsignal_new(b, x, cb, arg) \
- event_new((b), (x), EV_SIGNAL|EV_PERSIST, (cb), (arg))
- #define evsignal_del(ev) event_del(ev)
- #define evsignal_pending(ev, tv) event_pending((ev), EV_SIGNAL, (tv))
- #define evsignal_initialized(ev) event_initialized(ev)
- /**@}*/
- /**
- @name evuser_* macros
- Aliases for working with user-triggered events
- If you need EV_PERSIST event use event_*() functions.
- */
- /**@{*/
- #define evuser_new(b, cb, arg) event_new((b), -1, 0, (cb), (arg))
- #define evuser_del(ev) event_del(ev)
- #define evuser_pending(ev, tv) event_pending((ev), 0, (tv))
- #define evuser_initialized(ev) event_initialized(ev)
- #define evuser_trigger(ev) event_active((ev), 0, 0)
- /**@}*/
- /**
- A callback function for an event.
- It receives three arguments:
- @param fd An fd or signal
- @param events One or more EV_* flags
- @param arg A user-supplied argument.
- @see event_new()
- */
- typedef void (*event_callback_fn)(evutil_socket_t, short, void *);
- /**
- Return a value used to specify that the event itself must be used as the callback argument.
- The function event_new() takes a callback argument which is passed
- to the event's callback function. To specify that the argument to be
- passed to the callback function is the event that event_new() returns,
- pass in the return value of event_self_cbarg() as the callback argument
- for event_new().
- For example:
- <pre>
- struct event *ev = event_new(base, sock, events, callback, %event_self_cbarg());
- </pre>
- For consistency with event_new(), it is possible to pass the return value
- of this function as the callback argument for event_assign() – this
- achieves the same result as passing the event in directly.
- @return a value to be passed as the callback argument to event_new() or
- event_assign().
- @see event_new(), event_assign()
- */
- EVENT2_EXPORT_SYMBOL
- void *event_self_cbarg(void);
- /**
- Allocate and assign a new event structure, ready to be added.
- The function event_new() returns a new event that can be used in
- future calls to event_add() and event_del(). The fd and events
- arguments determine which conditions will trigger the event; the
- callback and callback_arg arguments tell Libevent what to do when the
- event becomes active.
- If events contains one of EV_READ, EV_WRITE, or EV_READ|EV_WRITE, then
- fd is a file descriptor or socket that should get monitored for
- readiness to read, readiness to write, or readiness for either operation
- (respectively). If events contains EV_SIGNAL, then fd is a signal
- number to wait for. If events contains none of those flags, then the
- event can be triggered only by a timeout or by manual activation with
- event_active(): In this case, fd must be -1.
- The EV_PERSIST flag can also be passed in the events argument: it makes
- event_add() persistent until event_del() is called.
- The EV_ET flag is compatible with EV_READ and EV_WRITE, and supported
- only by certain backends. It tells Libevent to use edge-triggered
- events.
- The EV_TIMEOUT flag has no effect here.
- It is okay to have multiple events all listening on the same fds; but
- they must either all be edge-triggered, or all not be edge triggered.
- When the event becomes active, the event loop will run the provided
- callback function, with three arguments. The first will be the provided
- fd value. The second will be a bitfield of the events that triggered:
- EV_READ, EV_WRITE, or EV_SIGNAL. Here the EV_TIMEOUT flag indicates
- that a timeout occurred, and EV_ET indicates that an edge-triggered
- event occurred. The third event will be the callback_arg pointer that
- you provide.
- @param base the event base to which the event should be attached.
- @param fd the file descriptor or signal to be monitored, or -1.
- @param events desired events to monitor: bitfield of EV_READ, EV_WRITE,
- EV_SIGNAL, EV_PERSIST, EV_ET.
- @param callback callback function to be invoked when the event occurs
- @param callback_arg an argument to be passed to the callback function
- @return a newly allocated struct event that must later be freed with
- event_free() or NULL if an error occurred.
- @see event_free(), event_add(), event_del(), event_assign()
- */
- EVENT2_EXPORT_SYMBOL
- struct event *event_new(struct event_base *, evutil_socket_t, short, event_callback_fn, void *);
- /**
- Prepare a new, already-allocated event structure to be added.
- The function event_assign() prepares the event structure ev to be used
- in future calls to event_add() and event_del(). Unlike event_new(), it
- doesn't allocate memory itself: it requires that you have already
- allocated a struct event, probably on the heap. Doing this will
- typically make your code depend on the size of the event structure, and
- thereby create incompatibility with future versions of Libevent.
- The easiest way to avoid this problem is just to use event_new() and
- event_free() instead.
- A slightly harder way to future-proof your code is to use
- event_get_struct_event_size() to determine the required size of an event
- at runtime.
- Note that it is NOT safe to call this function on an event that is
- active or pending. Doing so WILL corrupt internal data structures in
- Libevent, and lead to strange, hard-to-diagnose bugs. You _can_ use
- event_assign to change an existing event, but only if it is not active
- or pending!
- The arguments for this function, and the behavior of the events that it
- makes, are as for event_new().
- @param ev an event struct to be modified
- @param base the event base to which ev should be attached.
- @param fd the file descriptor to be monitored
- @param events desired events to monitor; can be EV_READ and/or EV_WRITE
- @param callback callback function to be invoked when the event occurs
- @param callback_arg an argument to be passed to the callback function
- @return 0 if success, or -1 on invalid arguments.
- @see event_new(), event_add(), event_del(), event_base_once(),
- event_get_struct_event_size()
- */
- EVENT2_EXPORT_SYMBOL
- int event_assign(struct event *, struct event_base *, evutil_socket_t, short, event_callback_fn, void *);
- /**
- Deallocate a struct event * returned by event_new().
- If the event is pending or active, this function makes it non-pending
- and non-active first.
- */
- EVENT2_EXPORT_SYMBOL
- void event_free(struct event *);
- /**
- * Callback type for event_finalize and event_free_finalize().
- **/
- typedef void (*event_finalize_callback_fn)(struct event *, void *);
- /**
- @name Finalization functions
- These functions are used to safely tear down an event in a multithreaded
- application. If you construct your events with EV_FINALIZE to avoid
- deadlocks, you will need a way to remove an event in the certainty that
- it will definitely not be running its callback when you deallocate it
- and its callback argument.
- To do this, call one of event_finalize() or event_free_finalize with
- 0 for its first argument, the event to tear down as its second argument,
- and a callback function as its third argument. The callback will be
- invoked as part of the event loop, with the event's priority.
- After you call a finalizer function, event_add() and event_active() will
- no longer work on the event, and event_del() will produce a no-op. You
- must not try to change the event's fields with event_assign() or
- event_set() while the finalize callback is in progress. Once the
- callback has been invoked, you should treat the event structure as
- containing uninitialized memory.
- The event_free_finalize() function frees the event after it's finalized;
- event_finalize() does not.
- A finalizer callback must not make events pending or active. It must not
- add events, activate events, or attempt to "resuscitate" the event being
- finalized in any way.
- @return 0 on success, -1 on failure.
- */
- /**@{*/
- EVENT2_EXPORT_SYMBOL
- int event_finalize(unsigned, struct event *, event_finalize_callback_fn);
- EVENT2_EXPORT_SYMBOL
- int event_free_finalize(unsigned, struct event *, event_finalize_callback_fn);
- /**@}*/
- /**
- Schedule a one-time event
- The function event_base_once() is similar to event_new(). However, it
- schedules a callback to be called exactly once, and does not require the
- caller to prepare an event structure.
- Note that in Libevent 2.0 and earlier, if the event is never triggered, the
- internal memory used to hold it will never be freed. In Libevent 2.1,
- the internal memory will get freed by event_base_free() if the event
- is never triggered. The 'arg' value, however, will not get freed in either
- case--you'll need to free that on your own if you want it to go away.
- @param base an event_base
- @param fd a file descriptor to monitor, or -1 for no fd.
- @param events event(s) to monitor; can be any of EV_READ |
- EV_WRITE, or EV_TIMEOUT
- @param callback callback function to be invoked when the event occurs
- @param arg an argument to be passed to the callback function
- @param timeout the maximum amount of time to wait for the event. NULL
- makes an EV_READ/EV_WRITE event make forever; NULL makes an
- EV_TIMEOUT event success immediately.
- @return 0 if successful, or -1 if an error occurred
- */
- EVENT2_EXPORT_SYMBOL
- int event_base_once(struct event_base *, evutil_socket_t, short, event_callback_fn, void *, const struct timeval *);
- /**
- Add an event to the set of pending events.
- The function event_add() schedules the execution of the event 'ev' when the
- condition specified by event_assign() or event_new() occurs, or when the time
- specified in timeout has elapsed. If a timeout is NULL, no timeout
- occurs and the function will only be
- called if a matching event occurs. The event in the
- ev argument must be already initialized by event_assign() or event_new()
- and may not be used
- in calls to event_assign() until it is no longer pending.
- If the event in the ev argument already has a scheduled timeout, calling
- event_add() replaces the old timeout with the new one if tv is non-NULL.
- @param ev an event struct initialized via event_assign() or event_new()
- @param timeout the maximum amount of time to wait for the event, or NULL
- to wait forever
- @return 0 if successful, or -1 if an error occurred
- @see event_del(), event_assign(), event_new()
- */
- EVENT2_EXPORT_SYMBOL
- int event_add(struct event *ev, const struct timeval *timeout);
- /**
- Remove a timer from a pending event without removing the event itself.
- If the event has a scheduled timeout, this function unschedules it but
- leaves the event otherwise pending.
- @param ev an event struct initialized via event_assign() or event_new()
- @return 0 on success, or -1 if an error occurred.
- */
- EVENT2_EXPORT_SYMBOL
- int event_remove_timer(struct event *ev);
- /**
- Remove an event from the set of monitored events.
- The function event_del() will cancel the event in the argument ev. If the
- event has already executed or has never been added the call will have no
- effect.
- @param ev an event struct to be removed from the working set
- @return 0 if successful, or -1 if an error occurred
- @see event_add()
- */
- EVENT2_EXPORT_SYMBOL
- int event_del(struct event *);
- /**
- As event_del(), but never blocks while the event's callback is running
- in another thread, even if the event was constructed without the
- EV_FINALIZE flag.
- */
- EVENT2_EXPORT_SYMBOL
- int event_del_noblock(struct event *ev);
- /**
- As event_del(), but always blocks while the event's callback is running
- in another thread, even if the event was constructed with the
- EV_FINALIZE flag.
- */
- EVENT2_EXPORT_SYMBOL
- int event_del_block(struct event *ev);
- /**
- Make an event active.
- You can use this function on a pending or a non-pending event to make it
- active, so that its callback will be run by event_base_dispatch() or
- event_base_loop().
- One common use in multithreaded programs is to wake the thread running
- event_base_loop() from another thread.
- @param ev an event to make active.
- @param res a set of flags to pass to the event's callback.
- @param ncalls an obsolete argument: this is ignored.
- **/
- EVENT2_EXPORT_SYMBOL
- void event_active(struct event *ev, int res, short ncalls);
- /**
- Checks if a specific event is pending or scheduled.
- @param ev an event struct previously passed to event_add()
- @param events the requested event type; any of EV_TIMEOUT|EV_READ|
- EV_WRITE|EV_SIGNAL
- @param tv if this field is not NULL, and the event has a timeout,
- this field is set to hold the time at which the timeout will
- expire.
- @return true if the event is pending on any of the events in 'what', (that
- is to say, it has been added), or 0 if the event is not added.
- */
- EVENT2_EXPORT_SYMBOL
- int event_pending(const struct event *ev, short events, struct timeval *tv);
- /**
- If called from within the callback for an event, returns that event.
- The behavior of this function is not defined when called from outside the
- callback function for an event.
- */
- EVENT2_EXPORT_SYMBOL
- struct event *event_base_get_running_event(struct event_base *base);
- /**
- Test if an event structure might be initialized.
- The event_initialized() function can be used to check if an event has been
- initialized.
- Warning: This function is only useful for distinguishing a zeroed-out
- piece of memory from an initialized event, it can easily be confused by
- uninitialized memory. Thus, it should ONLY be used to distinguish an
- initialized event from zero.
- @param ev an event structure to be tested
- @return 1 if the structure might be initialized, or 0 if it has not been
- initialized
- */
- EVENT2_EXPORT_SYMBOL
- int event_initialized(const struct event *ev);
- /**
- Get the signal number assigned to a signal event
- */
- #define event_get_signal(ev) ((int)event_get_fd(ev))
- /**
- Get the socket or signal assigned to an event, or -1 if the event has
- no socket.
- */
- EVENT2_EXPORT_SYMBOL
- evutil_socket_t event_get_fd(const struct event *ev);
- /**
- Get the event_base associated with an event.
- */
- EVENT2_EXPORT_SYMBOL
- struct event_base *event_get_base(const struct event *ev);
- /**
- Return the events (EV_READ, EV_WRITE, etc) assigned to an event.
- */
- EVENT2_EXPORT_SYMBOL
- short event_get_events(const struct event *ev);
- /**
- Return the callback assigned to an event.
- */
- EVENT2_EXPORT_SYMBOL
- event_callback_fn event_get_callback(const struct event *ev);
- /**
- Return the callback argument assigned to an event.
- */
- EVENT2_EXPORT_SYMBOL
- void *event_get_callback_arg(const struct event *ev);
- /**
- Return the priority of an event.
- @see event_priority_init(), event_get_priority()
- */
- EVENT2_EXPORT_SYMBOL
- int event_get_priority(const struct event *ev);
- /**
- Extract _all_ of arguments given to construct a given event. The
- event_base is copied into *base_out, the fd is copied into *fd_out, and so
- on.
- If any of the "_out" arguments is NULL, it will be ignored.
- */
- EVENT2_EXPORT_SYMBOL
- void event_get_assignment(const struct event *event,
- struct event_base **base_out, evutil_socket_t *fd_out, short *events_out,
- event_callback_fn *callback_out, void **arg_out);
- /**
- Return the size of struct event that the Libevent library was compiled
- with.
- This will be NO GREATER than sizeof(struct event) if you're running with
- the same version of Libevent that your application was built with, but
- otherwise might not.
- Note that it might be SMALLER than sizeof(struct event) if some future
- version of Libevent adds extra padding to the end of struct event.
- We might do this to help ensure ABI-compatibility between different
- versions of Libevent.
- */
- EVENT2_EXPORT_SYMBOL
- size_t event_get_struct_event_size(void);
- /**
- Get the Libevent version.
- Note that this will give you the version of the library that you're
- currently linked against, not the version of the headers that you've
- compiled against.
- @return a string containing the version number of Libevent
- */
- EVENT2_EXPORT_SYMBOL
- const char *event_get_version(void);
- /**
- Return a numeric representation of Libevent's version.
- Note that this will give you the version of the library that you're
- currently linked against, not the version of the headers you've used to
- compile.
- The format uses one byte each for the major, minor, and patchlevel parts of
- the version number. The low-order byte is unused. For example, version
- 2.0.1-alpha has a numeric representation of 0x02000100
- */
- EVENT2_EXPORT_SYMBOL
- ev_uint32_t event_get_version_number(void);
- /** As event_get_version, but gives the version of Libevent's headers. */
- #define LIBEVENT_VERSION EVENT__VERSION
- /** As event_get_version_number, but gives the version number of Libevent's
- * headers. */
- #define LIBEVENT_VERSION_NUMBER EVENT__NUMERIC_VERSION
- /** Largest number of priorities that Libevent can support. */
- #define EVENT_MAX_PRIORITIES 256
- /**
- Set the number of different event priorities
- By default Libevent schedules all active events with the same priority.
- However, some time it is desirable to process some events with a higher
- priority than others. For that reason, Libevent supports strict priority
- queues. Active events with a lower priority are always processed before
- events with a higher priority.
- The number of different priorities can be set initially with the
- event_base_priority_init() function. This function should be called
- before the first call to event_base_dispatch(). The
- event_priority_set() function can be used to assign a priority to an
- event. By default, Libevent assigns the middle priority to all events
- unless their priority is explicitly set.
- Note that urgent-priority events can starve less-urgent events: after
- running all urgent-priority callbacks, Libevent checks for more urgent
- events again, before running less-urgent events. Less-urgent events
- will not have their callbacks run until there are no events more urgent
- than them that want to be active.
- @param eb the event_base structure returned by event_base_new()
- @param npriorities the maximum number of priorities
- @return 0 if successful, or -1 if an error occurred
- @see event_priority_set()
- */
- EVENT2_EXPORT_SYMBOL
- int event_base_priority_init(struct event_base *, int);
- /**
- Get the number of different event priorities.
- @param eb the event_base structure returned by event_base_new()
- @return Number of different event priorities
- @see event_base_priority_init()
- */
- EVENT2_EXPORT_SYMBOL
- int event_base_get_npriorities(struct event_base *eb);
- /**
- Assign a priority to an event.
- @param ev an event struct
- @param priority the new priority to be assigned
- @return 0 if successful, or -1 if an error occurred
- @see event_priority_init(), event_get_priority()
- */
- EVENT2_EXPORT_SYMBOL
- int event_priority_set(struct event *, int);
- /**
- Prepare an event_base to use a large number of timeouts with the same
- duration.
- Libevent's default scheduling algorithm is optimized for having a large
- number of timeouts with their durations more or less randomly
- distributed. But if you have a large number of timeouts that all have
- the same duration (for example, if you have a large number of
- connections that all have a 10-second timeout), then you can improve
- Libevent's performance by telling Libevent about it.
- To do this, call this function with the common duration. It will return a
- pointer to a different, opaque timeout value. (Don't depend on its actual
- contents!) When you use this timeout value in event_add(), Libevent will
- schedule the event more efficiently.
- (This optimization probably will not be worthwhile until you have thousands
- or tens of thousands of events with the same timeout.)
- */
- EVENT2_EXPORT_SYMBOL
- const struct timeval *event_base_init_common_timeout(struct event_base *base,
- const struct timeval *duration);
- #if !defined(EVENT__DISABLE_MM_REPLACEMENT) || defined(EVENT_IN_DOXYGEN_)
- /**
- Override the functions that Libevent uses for memory management.
- Usually, Libevent uses the standard libc functions malloc, realloc, and
- free to allocate memory. Passing replacements for those functions to
- event_set_mem_functions() overrides this behavior.
- Note that all memory returned from Libevent will be allocated by the
- replacement functions rather than by malloc() and realloc(). Thus, if you
- have replaced those functions, it will not be appropriate to free() memory
- that you get from Libevent. Instead, you must use the free_fn replacement
- that you provided.
- Note also that if you are going to call this function, you should do so
- before any call to any Libevent function that does allocation.
- Otherwise, those functions will allocate their memory using malloc(), but
- then later free it using your provided free_fn.
- @param malloc_fn A replacement for malloc.
- @param realloc_fn A replacement for realloc
- @param free_fn A replacement for free.
- **/
- EVENT2_EXPORT_SYMBOL
- void event_set_mem_functions(
- void *(*malloc_fn)(size_t sz),
- void *(*realloc_fn)(void *ptr, size_t sz),
- void (*free_fn)(void *ptr));
- /** This definition is present if Libevent was built with support for
- event_set_mem_functions() */
- #define EVENT_SET_MEM_FUNCTIONS_IMPLEMENTED
- #endif
- /**
- Writes a human-readable description of all inserted and/or active
- events to a provided stdio stream.
- This is intended for debugging; its format is not guaranteed to be the same
- between libevent versions.
- @param base An event_base on which to scan the events.
- @param output A stdio file to write on.
- */
- EVENT2_EXPORT_SYMBOL
- void event_base_dump_events(struct event_base *, FILE *);
- /**
- Activates all pending events for the given fd and event mask.
- This function activates pending events only. Events which have not been
- added will not become active.
- @param base the event_base on which to activate the events.
- @param fd An fd to active events on.
- @param events One or more of EV_{READ,WRITE,TIMEOUT}.
- */
- EVENT2_EXPORT_SYMBOL
- void event_base_active_by_fd(struct event_base *base, evutil_socket_t fd, short events);
- /**
- Activates all pending signals with a given signal number
- This function activates pending events only. Events which have not been
- added will not become active.
- @param base the event_base on which to activate the events.
- @param fd The signal to active events on.
- */
- EVENT2_EXPORT_SYMBOL
- void event_base_active_by_signal(struct event_base *base, int sig);
- /**
- * Callback for iterating events in an event base via event_base_foreach_event
- */
- typedef int (*event_base_foreach_event_cb)(const struct event_base *, const struct event *, void *);
- /**
- Iterate over all added or active events events in an event loop, and invoke
- a given callback on each one.
- The callback must not call any function that modifies the event base, that
- modifies any event in the event base, or that adds or removes any event to
- the event base. Doing so is unsupported and will lead to undefined
- behavior -- likely, to crashes.
- event_base_foreach_event() holds a lock on the event_base() for the whole
- time it's running: slow callbacks are not advisable.
- Note that Libevent adds some events of its own to make pieces of its
- functionality work. You must not assume that the only events you'll
- encounter will be the ones you added yourself.
- The callback function must return 0 to continue iteration, or some other
- integer to stop iterating.
- @param base An event_base on which to scan the events.
- @param fn A callback function to receive the events.
- @param arg An argument passed to the callback function.
- @return 0 if we iterated over every event, or the value returned by the
- callback function if the loop exited early.
- */
- EVENT2_EXPORT_SYMBOL
- int event_base_foreach_event(struct event_base *base, event_base_foreach_event_cb fn, void *arg);
- /** Sets 'tv' to the current time (as returned by gettimeofday()),
- looking at the cached value in 'base' if possible, and calling
- gettimeofday() or clock_gettime() as appropriate if there is no
- cached time.
- Generally, this value will only be cached while actually
- processing event callbacks, and may be very inaccurate if your
- callbacks take a long time to execute.
- Returns 0 on success, negative on failure.
- */
- EVENT2_EXPORT_SYMBOL
- int event_base_gettimeofday_cached(struct event_base *base,
- struct timeval *tv);
- /** Update cached_tv in the 'base' to the current time
- *
- * You can use this function is useful for selectively increasing
- * the accuracy of the cached time value in 'base' during callbacks
- * that take a long time to execute.
- *
- * This function has no effect if the base is currently not in its
- * event loop, or if timeval caching is disabled via
- * EVENT_BASE_FLAG_NO_CACHE_TIME.
- *
- * @return 0 on success, -1 on failure
- */
- EVENT2_EXPORT_SYMBOL
- int event_base_update_cache_time(struct event_base *base);
- /** Release up all globally-allocated resources allocated by Libevent.
- This function does not free developer-controlled resources like
- event_bases, events, bufferevents, listeners, and so on. It only releases
- resources like global locks that there is no other way to free.
- It is not actually necessary to call this function before exit: every
- resource that it frees would be released anyway on exit. It mainly exists
- so that resource-leak debugging tools don't see Libevent as holding
- resources at exit.
- You should only call this function when no other Libevent functions will
- be invoked -- e.g., when cleanly exiting a program.
- */
- EVENT2_EXPORT_SYMBOL
- void libevent_global_shutdown(void);
- #ifdef __cplusplus
- }
- #endif
- #endif /* EVENT2_EVENT_H_INCLUDED_ */
|