EVENT(3)		   UNIX	Programmer's Manual		      EVENT(3)

NAME
     event_init, event_dispatch, event_loop, event_loopexit, event_set,
     event_base_dispatch, event_base_loop, event_base_loopexit,
     event_base_set, event_base_free, event_add, event_del, event_once,
     event_base_once, event_pending, event_initialized,	event_priority_init,
     event_priority_set, evtimer_set, evtimer_add, evtimer_del,
     evtimer_pending, evtimer_initialized, signal_set, signal_add, signal_del,
     signal_pending, signal_initialized, bufferevent_new, bufferevent_free,
     bufferevent_write,	bufferevent_write_buffer, bufferevent_read,
     bufferevent_enable, bufferevent_disable, bufferevent_settimeout,
     bufferevent_base_set, evbuffer_new, evbuffer_free,	evbuffer_add,
     evbuffer_add_buffer, evbuffer_add_printf, evbuffer_add_vprintf,
     evbuffer_drain, evbuffer_write, evbuffer_read, evbuffer_find,
     evbuffer_readline,	evhttp_start, evhttp_free - execute a function when a
     specific event occurs

SYNOPSIS
     event_init(void) event_dispatch(void) event_loop(int, flags)
     event_loopexit(struct, timeval, *tv) event_set(struct, event, *ev,	int,
     fd, short,	event) event_base_dispatch(struct, event_base, *base)
     event_base_loop(struct, event_base, *base,	int, flags)
     event_base_loopexit(struct, event_base, *base, struct, timeval, *tv)
     event_base_set(struct, event_base,	*base, struct, event, *)
     event_base_free(struct, event_base, *base)	event_add(struct, event, *ev,
     struct, timeval, *tv) event_del(struct, event, *ev) event_once(int, fd,
     short, event, void, (*fn)(int,, short,) event_base_once(struct,
     event_base, *base,	int, fd, short,	event) event_pending(struct, event,
     *ev, short, event,	struct,	timeval) event_initialized(struct, event, *ev)
     event_priority_init(int, npriorities) event_priority_set(struct, event,
     *ev, int, priority) evtimer_set(struct, event, *ev, void, (*fn)(int,,
     short,, void) evtimer_add(struct, event, *ev, struct, timeval, *)
     evtimer_del(struct, event,	*ev) evtimer_pending(struct, event, *ev,
     struct, timeval, *tv) evtimer_initialized(struct, event, *ev)
     signal_set(struct,	event, *ev, int, signal, void, (*fn)(int,)
     signal_add(struct,	event, *ev, struct, timeval, *)	signal_del(struct,
     event, *ev) signal_pending(struct,	event, *ev, struct, timeval, *tv)
     signal_initialized(struct,	event, *ev) bufferevent_new(int, fd, evbuf-
     fercb, readcb, evbuffercb,	writecb, everrorcb) bufferevent_free(struct,
     bufferevent, *bufev) bufferevent_write(struct, bufferevent, *bufev, void,
     *data, size_t, size) bufferevent_write_buffer(struct, bufferevent,
     *bufev, struct, evbuffer, *buf) bufferevent_read(struct, bufferevent,
     *bufev, void, *data, size_t, size)	bufferevent_enable(struct, buf-
     ferevent, *bufev, short, event) bufferevent_disable(struct, bufferevent,
     *bufev, short, event) bufferevent_settimeout(struct, bufferevent, *bufev,
     int, timeout_read,	int, timeout_write) bufferevent_base_set(struct,
     event_base, *base,	struct,	bufferevent, *bufev) evbuffer_new(void)
     evbuffer_free(struct, evbuffer, *buf) evbuffer_add(struct,	evbuffer,
     *buf, const, void,	*data, size_t) evbuffer_add_buffer(struct, evbuffer,
     *dst, struct, evbuffer, *src) evbuffer_add_printf(struct, evbuffer, *buf,
     const, char, *fmt,	...)  evbuffer_add_vprintf(struct, evbuffer, *buf,
     const, char, *fmt,	va_list) evbuffer_drain(struct,	evbuffer, *buf,
     size_t, size) evbuffer_write(struct, evbuffer, *buf, int, fd)
     evbuffer_read(struct, evbuffer, *buf, int,	fd, int, size)
     evbuffer_find(struct, evbuffer, *buf, const, u_char, *data, size_t)
     evbuffer_readline(struct, evbuffer, *buf) evhttp_start(const, char, *ad-
     dress, u_short, port) evhttp_free(struct, evhttp*,	http)

DESCRIPTION
     The event API provides a mechanism	to execute a function when a specific
     event on a	file descriptor	occurs or after	a given	time has passed.

     The event API needs to be initialized with	event_init() before it can be
     used.

     In	order to process events, an application	needs to call
     event_dispatch().	This function only returns on error, and should	re-
     place the event core of the application program.

     In	order to avoid races in	signal handlers, the event API provides	two
     variables:	 event_sigcb and event_gotsig.	A signal handler sets
     event_gotsig to indicate that a signal has	been received.	The applica-
     tion sets event_sigcb to a	callback function.  After the signal handler
     sets event_gotsig,	event_dispatch will execute the	callback function to
     process received signals.	The callback returns 1 when no events are re-
     gistered any more.	 It can	return -1 to indicate an error to the event
     library, causing event_dispatch() to terminate with errno set to EINTR.

     The event_loop function provides an interface for single pass execution
     of	pending	events.	 The flags EVLOOP_ONCE and EVLOOP_NONBLOCK are recog-
     nized.  The event_loopexit	function allows	the loop to be terminated
     after some	amount of time has passed.  The	parameter indicates the	time
     after which the loop should terminate.

     It	is the responsibility of the caller to provide these functions with
     pre-allocated event structures.

     The function event_set() prepares the event structure to be used in fu-
     ture calls	to event_add() and event_del().	 The event will	be prepared to
     call the function specified by the	argument with an argument indicating
     the file descriptor, a argument indicating	the type of event, and a argu-
     ment given	in the argument.  The indicates	the file descriptor that
     should be monitored for events.  The events can be	either EV_READ,
     EV_WRITE, or both,	indicating that	an application can read	or write from
     the file descriptor respectively without blocking.

     The function will be called with the file descriptor that triggered the
     event and the type	of event which will be either EV_TIMEOUT, EV_SIGNAL,
     EV_READ, or EV_WRITE.  The	additional flag	EV_PERSIST makes an
     event_add() persistent until event_del() has been called.

     Once initialized, the structure can be used repeatedly with event_add()
     and event_del() and does not need to be reinitialized unless the function
     called and/or the argument	to it are to be	changed.  However, when	an
     structure has been	added to libevent using	event_add() the	structure must
     persist until the event occurs (assuming is not set) or is	removed	using
     event_del().  You may not reuse the same structure	for multiple monitored
     descriptors; each descriptor needs	its own

     The function event_add() schedules	the execution of the event when	the
     event specified in	event_set() occurs or in at least the time specified
     in	the If is no timeout occurs and	the function will only be called if a
     matching event occurs on the file descriptor.  The	event in the argument
     must be already initialized by event_set()	and may	not be used in calls
     to	event_set() until it has timed out or been removed with	event_del().
     If	the event in the argument already has a	scheduled timeout, the old
     timeout will be replaced by the new one.

     The function event_del() will cancel the event in the argument If the
     event has already executed	or has never been added	the call will have no
     effect.

     The function event_once() is similar to event_set().  However, it
     schedules a callback to be	called exactly once and	does not require the
     caller to prepare an structure.  This function supports and

     The event_pending() function can be used to check if the event specified
     by	is pending to run.  If EV_TIMEOUT was specified	and is not the expira-
     tion time of the event will be returned in


     The event_initialized() macro can be used to check	if an event has	been
     initialized.

     The functions evtimer_set(), evtimer_add(), evtimer_del(),
     evtimer_initialized(), and	evtimer_pending() are abbreviations for	common
     situations	where only a timeout is	required.  The file descriptor passed
     will be -1, and the event type will be EV_TIMEOUT.

     The functions signal_set(), signal_add(), signal_del(),
     signal_initialized(), and signal_pending()	are abbreviations.  The	event
     type will be a persistent EV_SIGNAL.  That	means signal_set() adds
     EV_PERSIST.

     It	is possible to disable support for epoll, kqueue, devpoll, poll	or
     select by setting the environment variable	EVENT_NOEPOLL, EVENT_NOKQUEUE,
     EVENT_NODEVPOLL, EVENT_NOPOLL or EVENT_NOSELECT, respectively.  By	set-
     ting the environment variable EVENT_SHOW_METHOD, libevent displays	the
     kernel notification method	that it	uses.

EVENT PRIORITIES
     By	default	libevent schedules all active events with the same priority.
     However, sometimes	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_priority_init() function.  This function should be called before
     the first call to event_dispatch().  The event_priority_set() function
     can be used to assign a priority to an event.  By default,	libevent as-
     signs the middle priority to all events unless their priority is expli-
     citly set.

THREAD SAFE EVENTS
     Libevent has experimental support for thread-safe events.	When initial-
     izing the library via event_init(), an event base is returned.  This
     event base	can be used in conjunction with	calls to event_base_set(),
     event_base_dispatch(), event_base_loop(), event_base_loopexit(),
     bufferevent_base_set() and	event_base_free().  event_base_set() should be
     called after preparing an event with event_set(), as event_set() assigns
     the provided event	to the most recently created event base.
     bufferevent_base_set() should be called after preparing a bufferevent
     with bufferevent_new().  event_base_free()	should be used to free memory
     associated	with the event base when it is no longer needed.

BUFFERED EVENTS
     libevent provides an abstraction on top of	the regular event callbacks.
     This abstraction is called	a buffered event.  A buffered event provides
     input and output buffers that get filled and drained automatically.  The
     user of a buffered	event no longer	deals directly with the	IO, but	in-
     stead is reading from input and writing to	output buffers.

     A new bufferevent is created by bufferevent_new().	 The parameter speci-
     fies the file descriptor from which data is read and written to.  This
     file descriptor is	not allowed to be a pipe(2).  The next three parame-
     ters are callbacks.  The read and write callback have the following form:
     (*cb)(struct, bufferevent,	*bufev,	void, *arg).  The error	callback has
     the following form:  (*cb)(struct,	bufferevent, *bufev, short, what,
     void, *arg) The argument is specified by the fourth parameter A pointer
     is	returned on success, NULL on error.  Both the read and the write call-
     back may be NULL.	The error callback has to be always provided.

     Once initialized, the bufferevent structure can be	used repeatedly	with
     bufferevent_enable() and bufferevent_disable().  The flags	parameter can
     be	a combination of EV_READ and EV_WRITE.	When read enabled the buf-
     ferevent 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.

     The bufferevent_write() function can be used to write data	to the file
     descriptor.  The data is appended to the output buffer and	written	to the
     descriptor	automatically as it becomes available for writing.
     bufferevent_write() returns 0 on success or -1 on failure.	 The
     bufferevent_read()	function is used to read data from the input buffer,
     returning the amount of data read.

     If	multiple bases are in use, bufferevent_base_set() must be called be-
     fore enabling the bufferevent for the first time.

NON-BLOCKING HTTP SUPPORT
     libevent provides a very thin HTTP	layer that can be used both to host an
     HTTP server and also to make HTTP requests.  An HTTP server can be	creat-
     ed	by calling evhttp_start().  When the HTTP server is no longer used, it
     can be freed via evhttp_free().

     To	be notified of HTTP requests, a	user needs to register callbacks with
     the HTTP server.  This can	be done	by calling evhttp_set_cb().  The
     second argument is	the URI	for which a callback is	being registered.  The
     corresponding callback will receive an struct evhttp_request object that
     contains all information about the	request.

     This section does not document all	the possible function calls; please
     check event.h for the public interfaces.

RETURN VALUES
     Upon successful completion	event_add() and	event_del() return 0.  Other-
     wise, -1 is returned and the global variable errno	is set to indicate the
     error.

SEE ALSO
     kqueue(2),	poll(2), select(2), evdns(3), timeout(9)

HISTORY
     The event API manpage is based on the timeout(9) manpage by Artur Gra-
     bowski.  The port of libevent to Windows is due to	Michael	A. Davis.
     Support for real-time signals is due to Taral.

AUTHORS
     The event library was written by Niels Provos.

BUGS
     This documentation	is neither complete nor	authoritative.	If you are in
     doubt about the usage of this API then check the source code to find out
     how it works, write up the	missing	piece of documentation and send	it to
     me	for inclusion in this man page.

