Annotation of embedaddon/libevent/event.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
! 3: * All rights reserved.
! 4: *
! 5: * Redistribution and use in source and binary forms, with or without
! 6: * modification, are permitted provided that the following conditions
! 7: * are met:
! 8: * 1. Redistributions of source code must retain the above copyright
! 9: * notice, this list of conditions and the following disclaimer.
! 10: * 2. Redistributions in binary form must reproduce the above copyright
! 11: * notice, this list of conditions and the following disclaimer in the
! 12: * documentation and/or other materials provided with the distribution.
! 13: * 3. The name of the author may not be used to endorse or promote products
! 14: * derived from this software without specific prior written permission.
! 15: *
! 16: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 17: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 18: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 19: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! 20: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 21: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 22: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! 23: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 24: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 25: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 26: */
! 27: #ifndef _EVENT_H_
! 28: #define _EVENT_H_
! 29:
! 30: /** @mainpage
! 31:
! 32: @section intro Introduction
! 33:
! 34: libevent is an event notification library for developing scalable network
! 35: servers. The libevent API provides a mechanism to execute a callback
! 36: function when a specific event occurs on a file descriptor or after a
! 37: timeout has been reached. Furthermore, libevent also support callbacks due
! 38: to signals or regular timeouts.
! 39:
! 40: libevent is meant to replace the event loop found in event driven network
! 41: servers. An application just needs to call event_dispatch() and then add or
! 42: remove events dynamically without having to change the event loop.
! 43:
! 44: Currently, libevent supports /dev/poll, kqueue(2), select(2), poll(2) and
! 45: epoll(4). It also has experimental support for real-time signals. The
! 46: internal event mechanism is completely independent of the exposed event API,
! 47: and a simple update of libevent can provide new functionality without having
! 48: to redesign the applications. As a result, Libevent allows for portable
! 49: application development and provides the most scalable event notification
! 50: mechanism available on an operating system. Libevent can also be used for
! 51: multi-threaded aplications; see Steven Grimm's explanation. Libevent should
! 52: compile on Linux, *BSD, Mac OS X, Solaris and Windows.
! 53:
! 54: @section usage Standard usage
! 55:
! 56: Every program that uses libevent must include the <event.h> header, and pass
! 57: the -levent flag to the linker. Before using any of the functions in the
! 58: library, you must call event_init() or event_base_new() to perform one-time
! 59: initialization of the libevent library.
! 60:
! 61: @section event Event notification
! 62:
! 63: For each file descriptor that you wish to monitor, you must declare an event
! 64: structure and call event_set() to initialize the members of the structure.
! 65: To enable notification, you add the structure to the list of monitored
! 66: events by calling event_add(). The event structure must remain allocated as
! 67: long as it is active, so it should be allocated on the heap. Finally, you
! 68: call event_dispatch() to loop and dispatch events.
! 69:
! 70: @section bufferevent I/O Buffers
! 71:
! 72: libevent provides an abstraction on top of the regular event callbacks. This
! 73: abstraction is called a buffered event. A buffered event provides input and
! 74: output buffers that get filled and drained automatically. The user of a
! 75: buffered event no longer deals directly with the I/O, but instead is reading
! 76: from input and writing to output buffers.
! 77:
! 78: Once initialized via bufferevent_new(), the bufferevent structure can be
! 79: used repeatedly with bufferevent_enable() and bufferevent_disable().
! 80: Instead of reading and writing directly to a socket, you would call
! 81: bufferevent_read() and bufferevent_write().
! 82:
! 83: When read enabled the bufferevent will try to read from the file descriptor
! 84: and call the read callback. The write callback is executed whenever the
! 85: output buffer is drained below the write low watermark, which is 0 by
! 86: default.
! 87:
! 88: @section timers Timers
! 89:
! 90: libevent can also be used to create timers that invoke a callback after a
! 91: certain amount of time has expired. The evtimer_set() function prepares an
! 92: event struct to be used as a timer. To activate the timer, call
! 93: evtimer_add(). Timers can be deactivated by calling evtimer_del().
! 94:
! 95: @section timeouts Timeouts
! 96:
! 97: In addition to simple timers, libevent can assign timeout events to file
! 98: descriptors that are triggered whenever a certain amount of time has passed
! 99: with no activity on a file descriptor. The timeout_set() function
! 100: initializes an event struct for use as a timeout. Once initialized, the
! 101: event must be activated by using timeout_add(). To cancel the timeout, call
! 102: timeout_del().
! 103:
! 104: @section evdns Asynchronous DNS resolution
! 105:
! 106: libevent provides an asynchronous DNS resolver that should be used instead
! 107: of the standard DNS resolver functions. These functions can be imported by
! 108: including the <evdns.h> header in your program. Before using any of the
! 109: resolver functions, you must call evdns_init() to initialize the library. To
! 110: convert a hostname to an IP address, you call the evdns_resolve_ipv4()
! 111: function. To perform a reverse lookup, you would call the
! 112: evdns_resolve_reverse() function. All of these functions use callbacks to
! 113: avoid blocking while the lookup is performed.
! 114:
! 115: @section evhttp Event-driven HTTP servers
! 116:
! 117: libevent provides a very simple event-driven HTTP server that can be
! 118: embedded in your program and used to service HTTP requests.
! 119:
! 120: To use this capability, you need to include the <evhttp.h> header in your
! 121: program. You create the server by calling evhttp_new(). Add addresses and
! 122: ports to listen on with evhttp_bind_socket(). You then register one or more
! 123: callbacks to handle incoming requests. Each URI can be assigned a callback
! 124: via the evhttp_set_cb() function. A generic callback function can also be
! 125: registered via evhttp_set_gencb(); this callback will be invoked if no other
! 126: callbacks have been registered for a given URI.
! 127:
! 128: @section evrpc A framework for RPC servers and clients
! 129:
! 130: libevents provides a framework for creating RPC servers and clients. It
! 131: takes care of marshaling and unmarshaling all data structures.
! 132:
! 133: @section api API Reference
! 134:
! 135: To browse the complete documentation of the libevent API, click on any of
! 136: the following links.
! 137:
! 138: event.h
! 139: The primary libevent header
! 140:
! 141: evdns.h
! 142: Asynchronous DNS resolution
! 143:
! 144: evhttp.h
! 145: An embedded libevent-based HTTP server
! 146:
! 147: evrpc.h
! 148: A framework for creating RPC servers and clients
! 149:
! 150: */
! 151:
! 152: /** @file event.h
! 153:
! 154: A library for writing event-driven network servers
! 155:
! 156: */
! 157:
! 158: #ifdef __cplusplus
! 159: extern "C" {
! 160: #endif
! 161:
! 162: #include <event-config.h>
! 163: #ifdef _EVENT_HAVE_SYS_TYPES_H
! 164: #include <sys/types.h>
! 165: #endif
! 166: #ifdef _EVENT_HAVE_SYS_TIME_H
! 167: #include <sys/time.h>
! 168: #endif
! 169: #ifdef _EVENT_HAVE_STDINT_H
! 170: #include <stdint.h>
! 171: #endif
! 172: #include <stdarg.h>
! 173:
! 174: /* For int types. */
! 175: #include <evutil.h>
! 176:
! 177: #ifdef WIN32
! 178: #define WIN32_LEAN_AND_MEAN
! 179: #include <windows.h>
! 180: #undef WIN32_LEAN_AND_MEAN
! 181: typedef unsigned char u_char;
! 182: typedef unsigned short u_short;
! 183: #endif
! 184:
! 185: #define EVLIST_TIMEOUT 0x01
! 186: #define EVLIST_INSERTED 0x02
! 187: #define EVLIST_SIGNAL 0x04
! 188: #define EVLIST_ACTIVE 0x08
! 189: #define EVLIST_INTERNAL 0x10
! 190: #define EVLIST_INIT 0x80
! 191:
! 192: /* EVLIST_X_ Private space: 0x1000-0xf000 */
! 193: #define EVLIST_ALL (0xf000 | 0x9f)
! 194:
! 195: #define EV_TIMEOUT 0x01
! 196: #define EV_READ 0x02
! 197: #define EV_WRITE 0x04
! 198: #define EV_SIGNAL 0x08
! 199: #define EV_PERSIST 0x10 /* Persistant event */
! 200:
! 201: /* Fix so that ppl dont have to run with <sys/queue.h> */
! 202: #ifndef TAILQ_ENTRY
! 203: #define _EVENT_DEFINED_TQENTRY
! 204: #define TAILQ_ENTRY(type) \
! 205: struct { \
! 206: struct type *tqe_next; /* next element */ \
! 207: struct type **tqe_prev; /* address of previous next element */ \
! 208: }
! 209: #endif /* !TAILQ_ENTRY */
! 210:
! 211: struct event_base;
! 212: #ifndef EVENT_NO_STRUCT
! 213: struct event {
! 214: TAILQ_ENTRY (event) ev_next;
! 215: TAILQ_ENTRY (event) ev_active_next;
! 216: TAILQ_ENTRY (event) ev_signal_next;
! 217: unsigned int min_heap_idx; /* for managing timeouts */
! 218:
! 219: struct event_base *ev_base;
! 220:
! 221: int ev_fd;
! 222: short ev_events;
! 223: short ev_ncalls;
! 224: short *ev_pncalls; /* Allows deletes in callback */
! 225:
! 226: struct timeval ev_timeout;
! 227:
! 228: int ev_pri; /* smaller numbers are higher priority */
! 229:
! 230: void (*ev_callback)(int, short, void *arg);
! 231: void *ev_arg;
! 232:
! 233: int ev_res; /* result passed to event callback */
! 234: int ev_flags;
! 235: };
! 236: #else
! 237: struct event;
! 238: #endif
! 239:
! 240: #define EVENT_SIGNAL(ev) (int)(ev)->ev_fd
! 241: #define EVENT_FD(ev) (int)(ev)->ev_fd
! 242:
! 243: /*
! 244: * Key-Value pairs. Can be used for HTTP headers but also for
! 245: * query argument parsing.
! 246: */
! 247: struct evkeyval {
! 248: TAILQ_ENTRY(evkeyval) next;
! 249:
! 250: char *key;
! 251: char *value;
! 252: };
! 253:
! 254: #ifdef _EVENT_DEFINED_TQENTRY
! 255: #undef TAILQ_ENTRY
! 256: struct event_list;
! 257: struct evkeyvalq;
! 258: #undef _EVENT_DEFINED_TQENTRY
! 259: #else
! 260: TAILQ_HEAD (event_list, event);
! 261: TAILQ_HEAD (evkeyvalq, evkeyval);
! 262: #endif /* _EVENT_DEFINED_TQENTRY */
! 263:
! 264: /**
! 265: Initialize the event API.
! 266:
! 267: Use event_base_new() to initialize a new event base, but does not set
! 268: the current_base global. If using only event_base_new(), each event
! 269: added must have an event base set with event_base_set()
! 270:
! 271: @see event_base_set(), event_base_free(), event_init()
! 272: */
! 273: struct event_base *event_base_new(void);
! 274:
! 275: /**
! 276: Initialize the event API.
! 277:
! 278: The event API needs to be initialized with event_init() before it can be
! 279: used. Sets the current_base global representing the default base for
! 280: events that have no base associated with them.
! 281:
! 282: @see event_base_set(), event_base_new()
! 283: */
! 284: struct event_base *event_init(void);
! 285:
! 286: /**
! 287: Reinitialized the event base after a fork
! 288:
! 289: Some event mechanisms do not survive across fork. The event base needs
! 290: to be reinitialized with the event_reinit() function.
! 291:
! 292: @param base the event base that needs to be re-initialized
! 293: @return 0 if successful, or -1 if some events could not be re-added.
! 294: @see event_base_new(), event_init()
! 295: */
! 296: int event_reinit(struct event_base *base);
! 297:
! 298: /**
! 299: Loop to process events.
! 300:
! 301: In order to process events, an application needs to call
! 302: event_dispatch(). This function only returns on error, and should
! 303: replace the event core of the application program.
! 304:
! 305: @see event_base_dispatch()
! 306: */
! 307: int event_dispatch(void);
! 308:
! 309:
! 310: /**
! 311: Threadsafe event dispatching loop.
! 312:
! 313: @param eb the event_base structure returned by event_init()
! 314: @see event_init(), event_dispatch()
! 315: */
! 316: int event_base_dispatch(struct event_base *);
! 317:
! 318:
! 319: /**
! 320: Get the kernel event notification mechanism used by libevent.
! 321:
! 322: @param eb the event_base structure returned by event_base_new()
! 323: @return a string identifying the kernel event mechanism (kqueue, epoll, etc.)
! 324: */
! 325: const char *event_base_get_method(struct event_base *);
! 326:
! 327:
! 328: /**
! 329: Deallocate all memory associated with an event_base, and free the base.
! 330:
! 331: Note that this function will not close any fds or free any memory passed
! 332: to event_set as the argument to callback.
! 333:
! 334: @param eb an event_base to be freed
! 335: */
! 336: void event_base_free(struct event_base *);
! 337:
! 338:
! 339: #define _EVENT_LOG_DEBUG 0
! 340: #define _EVENT_LOG_MSG 1
! 341: #define _EVENT_LOG_WARN 2
! 342: #define _EVENT_LOG_ERR 3
! 343: typedef void (*event_log_cb)(int severity, const char *msg);
! 344: /**
! 345: Redirect libevent's log messages.
! 346:
! 347: @param cb a function taking two arguments: an integer severity between
! 348: _EVENT_LOG_DEBUG and _EVENT_LOG_ERR, and a string. If cb is NULL,
! 349: then the default log is used.
! 350: */
! 351: void event_set_log_callback(event_log_cb cb);
! 352:
! 353: /**
! 354: Associate a different event base with an event.
! 355:
! 356: @param eb the event base
! 357: @param ev the event
! 358: */
! 359: int event_base_set(struct event_base *, struct event *);
! 360:
! 361: /**
! 362: event_loop() flags
! 363: */
! 364: /*@{*/
! 365: #define EVLOOP_ONCE 0x01 /**< Block at most once. */
! 366: #define EVLOOP_NONBLOCK 0x02 /**< Do not block. */
! 367: /*@}*/
! 368:
! 369: /**
! 370: Handle events.
! 371:
! 372: This is a more flexible version of event_dispatch().
! 373:
! 374: @param flags any combination of EVLOOP_ONCE | EVLOOP_NONBLOCK
! 375: @return 0 if successful, -1 if an error occurred, or 1 if no events were
! 376: registered.
! 377: @see event_loopexit(), event_base_loop()
! 378: */
! 379: int event_loop(int);
! 380:
! 381: /**
! 382: Handle events (threadsafe version).
! 383:
! 384: This is a more flexible version of event_base_dispatch().
! 385:
! 386: @param eb the event_base structure returned by event_init()
! 387: @param flags any combination of EVLOOP_ONCE | EVLOOP_NONBLOCK
! 388: @return 0 if successful, -1 if an error occurred, or 1 if no events were
! 389: registered.
! 390: @see event_loopexit(), event_base_loop()
! 391: */
! 392: int event_base_loop(struct event_base *, int);
! 393:
! 394: /**
! 395: Exit the event loop after the specified time.
! 396:
! 397: The next event_loop() iteration after the given timer expires will
! 398: complete normally (handling all queued events) then exit without
! 399: blocking for events again.
! 400:
! 401: Subsequent invocations of event_loop() will proceed normally.
! 402:
! 403: @param tv the amount of time after which the loop should terminate.
! 404: @return 0 if successful, or -1 if an error occurred
! 405: @see event_loop(), event_base_loop(), event_base_loopexit()
! 406: */
! 407: int event_loopexit(const struct timeval *);
! 408:
! 409:
! 410: /**
! 411: Exit the event loop after the specified time (threadsafe variant).
! 412:
! 413: The next event_base_loop() iteration after the given timer expires will
! 414: complete normally (handling all queued events) then exit without
! 415: blocking for events again.
! 416:
! 417: Subsequent invocations of event_base_loop() will proceed normally.
! 418:
! 419: @param eb the event_base structure returned by event_init()
! 420: @param tv the amount of time after which the loop should terminate.
! 421: @return 0 if successful, or -1 if an error occurred
! 422: @see event_loopexit()
! 423: */
! 424: int event_base_loopexit(struct event_base *, const struct timeval *);
! 425:
! 426: /**
! 427: Abort the active event_loop() immediately.
! 428:
! 429: event_loop() will abort the loop after the next event is completed;
! 430: event_loopbreak() is typically invoked from this event's callback.
! 431: This behavior is analogous to the "break;" statement.
! 432:
! 433: Subsequent invocations of event_loop() will proceed normally.
! 434:
! 435: @return 0 if successful, or -1 if an error occurred
! 436: @see event_base_loopbreak(), event_loopexit()
! 437: */
! 438: int event_loopbreak(void);
! 439:
! 440: /**
! 441: Abort the active event_base_loop() immediately.
! 442:
! 443: event_base_loop() will abort the loop after the next event is completed;
! 444: event_base_loopbreak() is typically invoked from this event's callback.
! 445: This behavior is analogous to the "break;" statement.
! 446:
! 447: Subsequent invocations of event_loop() will proceed normally.
! 448:
! 449: @param eb the event_base structure returned by event_init()
! 450: @return 0 if successful, or -1 if an error occurred
! 451: @see event_base_loopexit
! 452: */
! 453: int event_base_loopbreak(struct event_base *);
! 454:
! 455:
! 456: /**
! 457: Add a timer event.
! 458:
! 459: @param ev the event struct
! 460: @param tv timeval struct
! 461: */
! 462: #define evtimer_add(ev, tv) event_add(ev, tv)
! 463:
! 464:
! 465: /**
! 466: Define a timer event.
! 467:
! 468: @param ev event struct to be modified
! 469: @param cb callback function
! 470: @param arg argument that will be passed to the callback function
! 471: */
! 472: #define evtimer_set(ev, cb, arg) event_set(ev, -1, 0, cb, arg)
! 473:
! 474:
! 475: /**
! 476: * Delete a timer event.
! 477: *
! 478: * @param ev the event struct to be disabled
! 479: */
! 480: #define evtimer_del(ev) event_del(ev)
! 481: #define evtimer_pending(ev, tv) event_pending(ev, EV_TIMEOUT, tv)
! 482: #define evtimer_initialized(ev) ((ev)->ev_flags & EVLIST_INIT)
! 483:
! 484: /**
! 485: * Add a timeout event.
! 486: *
! 487: * @param ev the event struct to be disabled
! 488: * @param tv the timeout value, in seconds
! 489: */
! 490: #define timeout_add(ev, tv) event_add(ev, tv)
! 491:
! 492:
! 493: /**
! 494: * Define a timeout event.
! 495: *
! 496: * @param ev the event struct to be defined
! 497: * @param cb the callback to be invoked when the timeout expires
! 498: * @param arg the argument to be passed to the callback
! 499: */
! 500: #define timeout_set(ev, cb, arg) event_set(ev, -1, 0, cb, arg)
! 501:
! 502:
! 503: /**
! 504: * Disable a timeout event.
! 505: *
! 506: * @param ev the timeout event to be disabled
! 507: */
! 508: #define timeout_del(ev) event_del(ev)
! 509:
! 510: #define timeout_pending(ev, tv) event_pending(ev, EV_TIMEOUT, tv)
! 511: #define timeout_initialized(ev) ((ev)->ev_flags & EVLIST_INIT)
! 512:
! 513: #define signal_add(ev, tv) event_add(ev, tv)
! 514: #define signal_set(ev, x, cb, arg) \
! 515: event_set(ev, x, EV_SIGNAL|EV_PERSIST, cb, arg)
! 516: #define signal_del(ev) event_del(ev)
! 517: #define signal_pending(ev, tv) event_pending(ev, EV_SIGNAL, tv)
! 518: #define signal_initialized(ev) ((ev)->ev_flags & EVLIST_INIT)
! 519:
! 520: /**
! 521: Prepare an event structure to be added.
! 522:
! 523: The function event_set() prepares the event structure ev to be used in
! 524: future calls to event_add() and event_del(). The event will be prepared to
! 525: call the function specified by the fn argument with an int argument
! 526: indicating the file descriptor, a short argument indicating the type of
! 527: event, and a void * argument given in the arg argument. The fd indicates
! 528: the file descriptor that should be monitored for events. The events can be
! 529: either EV_READ, EV_WRITE, or both. Indicating that an application can read
! 530: or write from the file descriptor respectively without blocking.
! 531:
! 532: The function fn will be called with the file descriptor that triggered the
! 533: event and the type of event which will be either EV_TIMEOUT, EV_SIGNAL,
! 534: EV_READ, or EV_WRITE. The additional flag EV_PERSIST makes an event_add()
! 535: persistent until event_del() has been called.
! 536:
! 537: @param ev an event struct to be modified
! 538: @param fd the file descriptor to be monitored
! 539: @param event desired events to monitor; can be EV_READ and/or EV_WRITE
! 540: @param fn callback function to be invoked when the event occurs
! 541: @param arg an argument to be passed to the callback function
! 542:
! 543: @see event_add(), event_del(), event_once()
! 544:
! 545: */
! 546: void event_set(struct event *, int, short, void (*)(int, short, void *), void *);
! 547:
! 548: /**
! 549: Schedule a one-time event to occur.
! 550:
! 551: The function event_once() is similar to event_set(). However, it schedules
! 552: a callback to be called exactly once and does not require the caller to
! 553: prepare an event structure.
! 554:
! 555: @param fd a file descriptor to monitor
! 556: @param events event(s) to monitor; can be any of EV_TIMEOUT | EV_READ |
! 557: EV_WRITE
! 558: @param callback callback function to be invoked when the event occurs
! 559: @param arg an argument to be passed to the callback function
! 560: @param timeout the maximum amount of time to wait for the event, or NULL
! 561: to wait forever
! 562: @return 0 if successful, or -1 if an error occurred
! 563: @see event_set()
! 564:
! 565: */
! 566: int event_once(int, short, void (*)(int, short, void *), void *,
! 567: const struct timeval *);
! 568:
! 569:
! 570: /**
! 571: Schedule a one-time event (threadsafe variant)
! 572:
! 573: The function event_base_once() is similar to event_set(). However, it
! 574: schedules a callback to be called exactly once and does not require the
! 575: caller to prepare an event structure.
! 576:
! 577: @param base an event_base returned by event_init()
! 578: @param fd a file descriptor to monitor
! 579: @param events event(s) to monitor; can be any of EV_TIMEOUT | EV_READ |
! 580: EV_WRITE
! 581: @param callback callback function to be invoked when the event occurs
! 582: @param arg an argument to be passed to the callback function
! 583: @param timeout the maximum amount of time to wait for the event, or NULL
! 584: to wait forever
! 585: @return 0 if successful, or -1 if an error occurred
! 586: @see event_once()
! 587: */
! 588: int event_base_once(struct event_base *base, int fd, short events,
! 589: void (*callback)(int, short, void *), void *arg,
! 590: const struct timeval *timeout);
! 591:
! 592:
! 593: /**
! 594: Add an event to the set of monitored events.
! 595:
! 596: The function event_add() schedules the execution of the ev event when the
! 597: event specified in event_set() occurs or in at least the time specified in
! 598: the tv. If tv is NULL, no timeout occurs and the function will only be
! 599: called if a matching event occurs on the file descriptor. The event in the
! 600: ev argument must be already initialized by event_set() and may not be used
! 601: in calls to event_set() until it has timed out or been removed with
! 602: event_del(). If the event in the ev argument already has a scheduled
! 603: timeout, the old timeout will be replaced by the new one.
! 604:
! 605: @param ev an event struct initialized via event_set()
! 606: @param timeout the maximum amount of time to wait for the event, or NULL
! 607: to wait forever
! 608: @return 0 if successful, or -1 if an error occurred
! 609: @see event_del(), event_set()
! 610: */
! 611: int event_add(struct event *ev, const struct timeval *timeout);
! 612:
! 613:
! 614: /**
! 615: Remove an event from the set of monitored events.
! 616:
! 617: The function event_del() will cancel the event in the argument ev. If the
! 618: event has already executed or has never been added the call will have no
! 619: effect.
! 620:
! 621: @param ev an event struct to be removed from the working set
! 622: @return 0 if successful, or -1 if an error occurred
! 623: @see event_add()
! 624: */
! 625: int event_del(struct event *);
! 626:
! 627: void event_active(struct event *, int, short);
! 628:
! 629:
! 630: /**
! 631: Checks if a specific event is pending or scheduled.
! 632:
! 633: @param ev an event struct previously passed to event_add()
! 634: @param event the requested event type; any of EV_TIMEOUT|EV_READ|
! 635: EV_WRITE|EV_SIGNAL
! 636: @param tv an alternate timeout (FIXME - is this true?)
! 637:
! 638: @return 1 if the event is pending, or 0 if the event has not occurred
! 639:
! 640: */
! 641: int event_pending(struct event *ev, short event, struct timeval *tv);
! 642:
! 643:
! 644: /**
! 645: Test if an event structure has been initialized.
! 646:
! 647: The event_initialized() macro can be used to check if an event has been
! 648: initialized.
! 649:
! 650: @param ev an event structure to be tested
! 651: @return 1 if the structure has been initialized, or 0 if it has not been
! 652: initialized
! 653: */
! 654: #ifdef WIN32
! 655: #define event_initialized(ev) ((ev)->ev_flags & EVLIST_INIT && (ev)->ev_fd != (int)INVALID_HANDLE_VALUE)
! 656: #else
! 657: #define event_initialized(ev) ((ev)->ev_flags & EVLIST_INIT)
! 658: #endif
! 659:
! 660:
! 661: /**
! 662: Get the libevent version number.
! 663:
! 664: @return a string containing the version number of libevent
! 665: */
! 666: const char *event_get_version(void);
! 667:
! 668:
! 669: /**
! 670: Get the kernel event notification mechanism used by libevent.
! 671:
! 672: @return a string identifying the kernel event mechanism (kqueue, epoll, etc.)
! 673: */
! 674: const char *event_get_method(void);
! 675:
! 676:
! 677: /**
! 678: Set the number of different event priorities.
! 679:
! 680: By default libevent schedules all active events with the same priority.
! 681: However, some time it is desirable to process some events with a higher
! 682: priority than others. For that reason, libevent supports strict priority
! 683: queues. Active events with a lower priority are always processed before
! 684: events with a higher priority.
! 685:
! 686: The number of different priorities can be set initially with the
! 687: event_priority_init() function. This function should be called before the
! 688: first call to event_dispatch(). The event_priority_set() function can be
! 689: used to assign a priority to an event. By default, libevent assigns the
! 690: middle priority to all events unless their priority is explicitly set.
! 691:
! 692: @param npriorities the maximum number of priorities
! 693: @return 0 if successful, or -1 if an error occurred
! 694: @see event_base_priority_init(), event_priority_set()
! 695:
! 696: */
! 697: int event_priority_init(int);
! 698:
! 699:
! 700: /**
! 701: Set the number of different event priorities (threadsafe variant).
! 702:
! 703: See the description of event_priority_init() for more information.
! 704:
! 705: @param eb the event_base structure returned by event_init()
! 706: @param npriorities the maximum number of priorities
! 707: @return 0 if successful, or -1 if an error occurred
! 708: @see event_priority_init(), event_priority_set()
! 709: */
! 710: int event_base_priority_init(struct event_base *, int);
! 711:
! 712:
! 713: /**
! 714: Assign a priority to an event.
! 715:
! 716: @param ev an event struct
! 717: @param priority the new priority to be assigned
! 718: @return 0 if successful, or -1 if an error occurred
! 719: @see event_priority_init()
! 720: */
! 721: int event_priority_set(struct event *, int);
! 722:
! 723:
! 724: /* These functions deal with buffering input and output */
! 725:
! 726: struct evbuffer {
! 727: u_char *buffer;
! 728: u_char *orig_buffer;
! 729:
! 730: size_t misalign;
! 731: size_t totallen;
! 732: size_t off;
! 733:
! 734: void (*cb)(struct evbuffer *, size_t, size_t, void *);
! 735: void *cbarg;
! 736: };
! 737:
! 738: /* Just for error reporting - use other constants otherwise */
! 739: #define EVBUFFER_READ 0x01
! 740: #define EVBUFFER_WRITE 0x02
! 741: #define EVBUFFER_EOF 0x10
! 742: #define EVBUFFER_ERROR 0x20
! 743: #define EVBUFFER_TIMEOUT 0x40
! 744:
! 745: struct bufferevent;
! 746: typedef void (*evbuffercb)(struct bufferevent *, void *);
! 747: typedef void (*everrorcb)(struct bufferevent *, short what, void *);
! 748:
! 749: struct event_watermark {
! 750: size_t low;
! 751: size_t high;
! 752: };
! 753:
! 754: #ifndef EVENT_NO_STRUCT
! 755: struct bufferevent {
! 756: struct event_base *ev_base;
! 757:
! 758: struct event ev_read;
! 759: struct event ev_write;
! 760:
! 761: struct evbuffer *input;
! 762: struct evbuffer *output;
! 763:
! 764: struct event_watermark wm_read;
! 765: struct event_watermark wm_write;
! 766:
! 767: evbuffercb readcb;
! 768: evbuffercb writecb;
! 769: everrorcb errorcb;
! 770: void *cbarg;
! 771:
! 772: int timeout_read; /* in seconds */
! 773: int timeout_write; /* in seconds */
! 774:
! 775: short enabled; /* events that are currently enabled */
! 776: };
! 777: #endif
! 778:
! 779: /**
! 780: Create a new bufferevent.
! 781:
! 782: libevent provides an abstraction on top of the regular event callbacks.
! 783: This abstraction is called a buffered event. A buffered event provides
! 784: input and output buffers that get filled and drained automatically. The
! 785: user of a buffered event no longer deals directly with the I/O, but
! 786: instead is reading from input and writing to output buffers.
! 787:
! 788: Once initialized, the bufferevent structure can be used repeatedly with
! 789: bufferevent_enable() and bufferevent_disable().
! 790:
! 791: When read enabled the bufferevent will try to read from the file descriptor
! 792: and call the read callback. The write callback is executed whenever the
! 793: output buffer is drained below the write low watermark, which is 0 by
! 794: default.
! 795:
! 796: If multiple bases are in use, bufferevent_base_set() must be called before
! 797: enabling the bufferevent for the first time.
! 798:
! 799: @param fd the file descriptor from which data is read and written to.
! 800: This file descriptor is not allowed to be a pipe(2).
! 801: @param readcb callback to invoke when there is data to be read, or NULL if
! 802: no callback is desired
! 803: @param writecb callback to invoke when the file descriptor is ready for
! 804: writing, or NULL if no callback is desired
! 805: @param errorcb callback to invoke when there is an error on the file
! 806: descriptor
! 807: @param cbarg an argument that will be supplied to each of the callbacks
! 808: (readcb, writecb, and errorcb)
! 809: @return a pointer to a newly allocated bufferevent struct, or NULL if an
! 810: error occurred
! 811: @see bufferevent_base_set(), bufferevent_free()
! 812: */
! 813: struct bufferevent *bufferevent_new(int fd,
! 814: evbuffercb readcb, evbuffercb writecb, everrorcb errorcb, void *cbarg);
! 815:
! 816:
! 817: /**
! 818: Assign a bufferevent to a specific event_base.
! 819:
! 820: @param base an event_base returned by event_init()
! 821: @param bufev a bufferevent struct returned by bufferevent_new()
! 822: @return 0 if successful, or -1 if an error occurred
! 823: @see bufferevent_new()
! 824: */
! 825: int bufferevent_base_set(struct event_base *base, struct bufferevent *bufev);
! 826:
! 827:
! 828: /**
! 829: Assign a priority to a bufferevent.
! 830:
! 831: @param bufev a bufferevent struct
! 832: @param pri the priority to be assigned
! 833: @return 0 if successful, or -1 if an error occurred
! 834: */
! 835: int bufferevent_priority_set(struct bufferevent *bufev, int pri);
! 836:
! 837:
! 838: /**
! 839: Deallocate the storage associated with a bufferevent structure.
! 840:
! 841: @param bufev the bufferevent structure to be freed.
! 842: */
! 843: void bufferevent_free(struct bufferevent *bufev);
! 844:
! 845:
! 846: /**
! 847: Changes the callbacks for a bufferevent.
! 848:
! 849: @param bufev the bufferevent object for which to change callbacks
! 850: @param readcb callback to invoke when there is data to be read, or NULL if
! 851: no callback is desired
! 852: @param writecb callback to invoke when the file descriptor is ready for
! 853: writing, or NULL if no callback is desired
! 854: @param errorcb callback to invoke when there is an error on the file
! 855: descriptor
! 856: @param cbarg an argument that will be supplied to each of the callbacks
! 857: (readcb, writecb, and errorcb)
! 858: @see bufferevent_new()
! 859: */
! 860: void bufferevent_setcb(struct bufferevent *bufev,
! 861: evbuffercb readcb, evbuffercb writecb, everrorcb errorcb, void *cbarg);
! 862:
! 863: /**
! 864: Changes the file descriptor on which the bufferevent operates.
! 865:
! 866: @param bufev the bufferevent object for which to change the file descriptor
! 867: @param fd the file descriptor to operate on
! 868: */
! 869: void bufferevent_setfd(struct bufferevent *bufev, int fd);
! 870:
! 871: /**
! 872: Write data to a bufferevent buffer.
! 873:
! 874: The bufferevent_write() function can be used to write data to the file
! 875: descriptor. The data is appended to the output buffer and written to the
! 876: descriptor automatically as it becomes available for writing.
! 877:
! 878: @param bufev the bufferevent to be written to
! 879: @param data a pointer to the data to be written
! 880: @param size the length of the data, in bytes
! 881: @return 0 if successful, or -1 if an error occurred
! 882: @see bufferevent_write_buffer()
! 883: */
! 884: int bufferevent_write(struct bufferevent *bufev,
! 885: const void *data, size_t size);
! 886:
! 887:
! 888: /**
! 889: Write data from an evbuffer to a bufferevent buffer. The evbuffer is
! 890: being drained as a result.
! 891:
! 892: @param bufev the bufferevent to be written to
! 893: @param buf the evbuffer to be written
! 894: @return 0 if successful, or -1 if an error occurred
! 895: @see bufferevent_write()
! 896: */
! 897: int bufferevent_write_buffer(struct bufferevent *bufev, struct evbuffer *buf);
! 898:
! 899:
! 900: /**
! 901: Read data from a bufferevent buffer.
! 902:
! 903: The bufferevent_read() function is used to read data from the input buffer.
! 904:
! 905: @param bufev the bufferevent to be read from
! 906: @param data pointer to a buffer that will store the data
! 907: @param size the size of the data buffer, in bytes
! 908: @return the amount of data read, in bytes.
! 909: */
! 910: size_t bufferevent_read(struct bufferevent *bufev, void *data, size_t size);
! 911:
! 912: /**
! 913: Enable a bufferevent.
! 914:
! 915: @param bufev the bufferevent to be enabled
! 916: @param event any combination of EV_READ | EV_WRITE.
! 917: @return 0 if successful, or -1 if an error occurred
! 918: @see bufferevent_disable()
! 919: */
! 920: int bufferevent_enable(struct bufferevent *bufev, short event);
! 921:
! 922:
! 923: /**
! 924: Disable a bufferevent.
! 925:
! 926: @param bufev the bufferevent to be disabled
! 927: @param event any combination of EV_READ | EV_WRITE.
! 928: @return 0 if successful, or -1 if an error occurred
! 929: @see bufferevent_enable()
! 930: */
! 931: int bufferevent_disable(struct bufferevent *bufev, short event);
! 932:
! 933:
! 934: /**
! 935: Set the read and write timeout for a buffered event.
! 936:
! 937: @param bufev the bufferevent to be modified
! 938: @param timeout_read the read timeout
! 939: @param timeout_write the write timeout
! 940: */
! 941: void bufferevent_settimeout(struct bufferevent *bufev,
! 942: int timeout_read, int timeout_write);
! 943:
! 944:
! 945: /**
! 946: Sets the watermarks for read and write events.
! 947:
! 948: On input, a bufferevent does not invoke the user read callback unless
! 949: there is at least low watermark data in the buffer. If the read buffer
! 950: is beyond the high watermark, the buffevent stops reading from the network.
! 951:
! 952: On output, the user write callback is invoked whenever the buffered data
! 953: falls below the low watermark.
! 954:
! 955: @param bufev the bufferevent to be modified
! 956: @param events EV_READ, EV_WRITE or both
! 957: @param lowmark the lower watermark to set
! 958: @param highmark the high watermark to set
! 959: */
! 960:
! 961: void bufferevent_setwatermark(struct bufferevent *bufev, short events,
! 962: size_t lowmark, size_t highmark);
! 963:
! 964: #define EVBUFFER_LENGTH(x) (x)->off
! 965: #define EVBUFFER_DATA(x) (x)->buffer
! 966: #define EVBUFFER_INPUT(x) (x)->input
! 967: #define EVBUFFER_OUTPUT(x) (x)->output
! 968:
! 969:
! 970: /**
! 971: Allocate storage for a new evbuffer.
! 972:
! 973: @return a pointer to a newly allocated evbuffer struct, or NULL if an error
! 974: occurred
! 975: */
! 976: struct evbuffer *evbuffer_new(void);
! 977:
! 978:
! 979: /**
! 980: Deallocate storage for an evbuffer.
! 981:
! 982: @param pointer to the evbuffer to be freed
! 983: */
! 984: void evbuffer_free(struct evbuffer *);
! 985:
! 986:
! 987: /**
! 988: Expands the available space in an event buffer.
! 989:
! 990: Expands the available space in the event buffer to at least datlen
! 991:
! 992: @param buf the event buffer to be expanded
! 993: @param datlen the new minimum length requirement
! 994: @return 0 if successful, or -1 if an error occurred
! 995: */
! 996: int evbuffer_expand(struct evbuffer *, size_t);
! 997:
! 998:
! 999: /**
! 1000: Append data to the end of an evbuffer.
! 1001:
! 1002: @param buf the event buffer to be appended to
! 1003: @param data pointer to the beginning of the data buffer
! 1004: @param datlen the number of bytes to be copied from the data buffer
! 1005: */
! 1006: int evbuffer_add(struct evbuffer *, const void *, size_t);
! 1007:
! 1008:
! 1009:
! 1010: /**
! 1011: Read data from an event buffer and drain the bytes read.
! 1012:
! 1013: @param buf the event buffer to be read from
! 1014: @param data the destination buffer to store the result
! 1015: @param datlen the maximum size of the destination buffer
! 1016: @return the number of bytes read
! 1017: */
! 1018: int evbuffer_remove(struct evbuffer *, void *, size_t);
! 1019:
! 1020:
! 1021: /**
! 1022: * Read a single line from an event buffer.
! 1023: *
! 1024: * Reads a line terminated by either '\r\n', '\n\r' or '\r' or '\n'.
! 1025: * The returned buffer needs to be freed by the caller.
! 1026: *
! 1027: * @param buffer the evbuffer to read from
! 1028: * @return pointer to a single line, or NULL if an error occurred
! 1029: */
! 1030: char *evbuffer_readline(struct evbuffer *);
! 1031:
! 1032:
! 1033: /** Used to tell evbuffer_readln what kind of line-ending to look for.
! 1034: */
! 1035: enum evbuffer_eol_style {
! 1036: /** Any sequence of CR and LF characters is acceptable as an EOL. */
! 1037: EVBUFFER_EOL_ANY,
! 1038: /** An EOL is an LF, optionally preceded by a CR. This style is
! 1039: * most useful for implementing text-based internet protocols. */
! 1040: EVBUFFER_EOL_CRLF,
! 1041: /** An EOL is a CR followed by an LF. */
! 1042: EVBUFFER_EOL_CRLF_STRICT,
! 1043: /** An EOL is a LF. */
! 1044: EVBUFFER_EOL_LF
! 1045: };
! 1046:
! 1047: /**
! 1048: * Read a single line from an event buffer.
! 1049: *
! 1050: * Reads a line terminated by an EOL as determined by the evbuffer_eol_style
! 1051: * argument. Returns a newly allocated nul-terminated string; the caller must
! 1052: * free the returned value. The EOL is not included in the returned string.
! 1053: *
! 1054: * @param buffer the evbuffer to read from
! 1055: * @param n_read_out if non-NULL, points to a size_t that is set to the
! 1056: * number of characters in the returned string. This is useful for
! 1057: * strings that can contain NUL characters.
! 1058: * @param eol_style the style of line-ending to use.
! 1059: * @return pointer to a single line, or NULL if an error occurred
! 1060: */
! 1061: char *evbuffer_readln(struct evbuffer *buffer, size_t *n_read_out,
! 1062: enum evbuffer_eol_style eol_style);
! 1063:
! 1064:
! 1065: /**
! 1066: Move data from one evbuffer into another evbuffer.
! 1067:
! 1068: This is a destructive add. The data from one buffer moves into
! 1069: the other buffer. The destination buffer is expanded as needed.
! 1070:
! 1071: @param outbuf the output buffer
! 1072: @param inbuf the input buffer
! 1073: @return 0 if successful, or -1 if an error occurred
! 1074: */
! 1075: int evbuffer_add_buffer(struct evbuffer *, struct evbuffer *);
! 1076:
! 1077:
! 1078: /**
! 1079: Append a formatted string to the end of an evbuffer.
! 1080:
! 1081: @param buf the evbuffer that will be appended to
! 1082: @param fmt a format string
! 1083: @param ... arguments that will be passed to printf(3)
! 1084: @return The number of bytes added if successful, or -1 if an error occurred.
! 1085: */
! 1086: int evbuffer_add_printf(struct evbuffer *, const char *fmt, ...)
! 1087: #ifdef __GNUC__
! 1088: __attribute__((format(printf, 2, 3)))
! 1089: #endif
! 1090: ;
! 1091:
! 1092:
! 1093: /**
! 1094: Append a va_list formatted string to the end of an evbuffer.
! 1095:
! 1096: @param buf the evbuffer that will be appended to
! 1097: @param fmt a format string
! 1098: @param ap a varargs va_list argument array that will be passed to vprintf(3)
! 1099: @return The number of bytes added if successful, or -1 if an error occurred.
! 1100: */
! 1101: int evbuffer_add_vprintf(struct evbuffer *, const char *fmt, va_list ap);
! 1102:
! 1103:
! 1104: /**
! 1105: Remove a specified number of bytes data from the beginning of an evbuffer.
! 1106:
! 1107: @param buf the evbuffer to be drained
! 1108: @param len the number of bytes to drain from the beginning of the buffer
! 1109: */
! 1110: void evbuffer_drain(struct evbuffer *, size_t);
! 1111:
! 1112:
! 1113: /**
! 1114: Write the contents of an evbuffer to a file descriptor.
! 1115:
! 1116: The evbuffer will be drained after the bytes have been successfully written.
! 1117:
! 1118: @param buffer the evbuffer to be written and drained
! 1119: @param fd the file descriptor to be written to
! 1120: @return the number of bytes written, or -1 if an error occurred
! 1121: @see evbuffer_read()
! 1122: */
! 1123: int evbuffer_write(struct evbuffer *, int);
! 1124:
! 1125:
! 1126: /**
! 1127: Read from a file descriptor and store the result in an evbuffer.
! 1128:
! 1129: @param buf the evbuffer to store the result
! 1130: @param fd the file descriptor to read from
! 1131: @param howmuch the number of bytes to be read
! 1132: @return the number of bytes read, or -1 if an error occurred
! 1133: @see evbuffer_write()
! 1134: */
! 1135: int evbuffer_read(struct evbuffer *, int, int);
! 1136:
! 1137:
! 1138: /**
! 1139: Find a string within an evbuffer.
! 1140:
! 1141: @param buffer the evbuffer to be searched
! 1142: @param what the string to be searched for
! 1143: @param len the length of the search string
! 1144: @return a pointer to the beginning of the search string, or NULL if the search failed.
! 1145: */
! 1146: u_char *evbuffer_find(struct evbuffer *, const u_char *, size_t);
! 1147:
! 1148: /**
! 1149: Set a callback to invoke when the evbuffer is modified.
! 1150:
! 1151: @param buffer the evbuffer to be monitored
! 1152: @param cb the callback function to invoke when the evbuffer is modified
! 1153: @param cbarg an argument to be provided to the callback function
! 1154: */
! 1155: void evbuffer_setcb(struct evbuffer *, void (*)(struct evbuffer *, size_t, size_t, void *), void *);
! 1156:
! 1157: /*
! 1158: * Marshaling tagged data - We assume that all tags are inserted in their
! 1159: * numeric order - so that unknown tags will always be higher than the
! 1160: * known ones - and we can just ignore the end of an event buffer.
! 1161: */
! 1162:
! 1163: void evtag_init(void);
! 1164:
! 1165: void evtag_marshal(struct evbuffer *evbuf, ev_uint32_t tag, const void *data,
! 1166: ev_uint32_t len);
! 1167:
! 1168: /**
! 1169: Encode an integer and store it in an evbuffer.
! 1170:
! 1171: We encode integer's by nibbles; the first nibble contains the number
! 1172: of significant nibbles - 1; this allows us to encode up to 64-bit
! 1173: integers. This function is byte-order independent.
! 1174:
! 1175: @param evbuf evbuffer to store the encoded number
! 1176: @param number a 32-bit integer
! 1177: */
! 1178: void encode_int(struct evbuffer *evbuf, ev_uint32_t number);
! 1179:
! 1180: void evtag_marshal_int(struct evbuffer *evbuf, ev_uint32_t tag,
! 1181: ev_uint32_t integer);
! 1182:
! 1183: void evtag_marshal_string(struct evbuffer *buf, ev_uint32_t tag,
! 1184: const char *string);
! 1185:
! 1186: void evtag_marshal_timeval(struct evbuffer *evbuf, ev_uint32_t tag,
! 1187: struct timeval *tv);
! 1188:
! 1189: int evtag_unmarshal(struct evbuffer *src, ev_uint32_t *ptag,
! 1190: struct evbuffer *dst);
! 1191: int evtag_peek(struct evbuffer *evbuf, ev_uint32_t *ptag);
! 1192: int evtag_peek_length(struct evbuffer *evbuf, ev_uint32_t *plength);
! 1193: int evtag_payload_length(struct evbuffer *evbuf, ev_uint32_t *plength);
! 1194: int evtag_consume(struct evbuffer *evbuf);
! 1195:
! 1196: int evtag_unmarshal_int(struct evbuffer *evbuf, ev_uint32_t need_tag,
! 1197: ev_uint32_t *pinteger);
! 1198:
! 1199: int evtag_unmarshal_fixed(struct evbuffer *src, ev_uint32_t need_tag,
! 1200: void *data, size_t len);
! 1201:
! 1202: int evtag_unmarshal_string(struct evbuffer *evbuf, ev_uint32_t need_tag,
! 1203: char **pstring);
! 1204:
! 1205: int evtag_unmarshal_timeval(struct evbuffer *evbuf, ev_uint32_t need_tag,
! 1206: struct timeval *ptv);
! 1207:
! 1208: #ifdef __cplusplus
! 1209: }
! 1210: #endif
! 1211:
! 1212: #endif /* _EVENT_H_ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>