Annotation of embedaddon/libevent/event.3, revision 1.1.1.1

1.1       misho       1: .\"    $OpenBSD: event.3,v 1.4 2002/07/12 18:50:48 provos Exp $
                      2: .\"
                      3: .\" Copyright (c) 2000 Artur Grabowski <art@openbsd.org>
                      4: .\" All rights reserved.
                      5: .\"
                      6: .\" Redistribution and use in source and binary forms, with or without
                      7: .\" modification, are permitted provided that the following conditions
                      8: .\" are met:
                      9: .\"
                     10: .\" 1. Redistributions of source code must retain the above copyright
                     11: .\"    notice, this list of conditions and the following disclaimer.
                     12: .\" 2. Redistributions in binary form must reproduce the above copyright
                     13: .\"    notice, this list of conditions and the following disclaimer in the
                     14: .\"    documentation and/or other materials provided with the distribution.
                     15: .\" 3. The name of the author may not be used to endorse or promote products
                     16: .\"    derived from this software without specific prior written permission.
                     17: .\"
                     18: .\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
                     19: .\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
                     20: .\" AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
                     21: .\" THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
                     22: .\" EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLUDING, BUT NOT LIMITED TO,
                     23: .\" PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
                     24: .\" OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
                     25: .\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
                     26: .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
                     27: .\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     28: .\"
                     29: .Dd August 8, 2000
                     30: .Dt EVENT 3
                     31: .Os
                     32: .Sh NAME
                     33: .Nm event_init ,
                     34: .Nm event_dispatch ,
                     35: .Nm event_loop ,
                     36: .Nm event_loopexit ,
                     37: .Nm event_loopbreak ,
                     38: .Nm event_set ,
                     39: .Nm event_base_dispatch ,
                     40: .Nm event_base_loop ,
                     41: .Nm event_base_loopexit ,
                     42: .Nm event_base_loopbreak ,
                     43: .Nm event_base_set ,
                     44: .Nm event_base_free ,
                     45: .Nm event_add ,
                     46: .Nm event_del ,
                     47: .Nm event_once ,
                     48: .Nm event_base_once ,
                     49: .Nm event_pending ,
                     50: .Nm event_initialized ,
                     51: .Nm event_priority_init ,
                     52: .Nm event_priority_set ,
                     53: .Nm evtimer_set ,
                     54: .Nm evtimer_add ,
                     55: .Nm evtimer_del ,
                     56: .Nm evtimer_pending ,
                     57: .Nm evtimer_initialized ,
                     58: .Nm signal_set ,
                     59: .Nm signal_add ,
                     60: .Nm signal_del ,
                     61: .Nm signal_pending ,
                     62: .Nm signal_initialized ,
                     63: .Nm bufferevent_new ,
                     64: .Nm bufferevent_free ,
                     65: .Nm bufferevent_write ,
                     66: .Nm bufferevent_write_buffer ,
                     67: .Nm bufferevent_read ,
                     68: .Nm bufferevent_enable ,
                     69: .Nm bufferevent_disable ,
                     70: .Nm bufferevent_settimeout ,
                     71: .Nm bufferevent_base_set ,
                     72: .Nm evbuffer_new ,
                     73: .Nm evbuffer_free ,
                     74: .Nm evbuffer_add ,
                     75: .Nm evbuffer_add_buffer ,
                     76: .Nm evbuffer_add_printf ,
                     77: .Nm evbuffer_add_vprintf ,
                     78: .Nm evbuffer_drain ,
                     79: .Nm evbuffer_write ,
                     80: .Nm evbuffer_read ,
                     81: .Nm evbuffer_find ,
                     82: .Nm evbuffer_readline ,
                     83: .Nm evhttp_new ,
                     84: .Nm evhttp_bind_socket ,
                     85: .Nm evhttp_free
                     86: .Nd execute a function when a specific event occurs
                     87: .Sh SYNOPSIS
                     88: .Fd #include <sys/time.h>
                     89: .Fd #include <event.h>
                     90: .Ft "struct event_base *"
                     91: .Fn "event_init" "void"
                     92: .Ft int
                     93: .Fn "event_dispatch" "void"
                     94: .Ft int
                     95: .Fn "event_loop" "int flags"
                     96: .Ft int
                     97: .Fn "event_loopexit" "struct timeval *tv"
                     98: .Ft int
                     99: .Fn "event_loopbreak" "void"
                    100: .Ft void
                    101: .Fn "event_set" "struct event *ev" "int fd" "short event" "void (*fn)(int, short, void *)" "void *arg"
                    102: .Ft int
                    103: .Fn "event_base_dispatch" "struct event_base *base"
                    104: .Ft int
                    105: .Fn "event_base_loop" "struct event_base *base" "int flags"
                    106: .Ft int
                    107: .Fn "event_base_loopexit" "struct event_base *base" "struct timeval *tv"
                    108: .Ft int
                    109: .Fn "event_base_loopbreak" "struct event_base *base"
                    110: .Ft int
                    111: .Fn "event_base_set" "struct event_base *base" "struct event *"
                    112: .Ft void
                    113: .Fn "event_base_free" "struct event_base *base"
                    114: .Ft int
                    115: .Fn "event_add" "struct event *ev" "struct timeval *tv"
                    116: .Ft int
                    117: .Fn "event_del" "struct event *ev"
                    118: .Ft int
                    119: .Fn "event_once" "int fd" "short event" "void (*fn)(int, short, void *)" "void *arg" "struct timeval *tv"
                    120: .Ft int
                    121: .Fn "event_base_once" "struct event_base *base" "int fd" "short event" "void (*fn)(int, short, void *)" "void *arg" "struct timeval *tv"
                    122: .Ft int
                    123: .Fn "event_pending" "struct event *ev" "short event" "struct timeval *tv"
                    124: .Ft int
                    125: .Fn "event_initialized" "struct event *ev"
                    126: .Ft int
                    127: .Fn "event_priority_init" "int npriorities"
                    128: .Ft int
                    129: .Fn "event_priority_set" "struct event *ev" "int priority"
                    130: .Ft void
                    131: .Fn "evtimer_set" "struct event *ev" "void (*fn)(int, short, void *)" "void *arg"
                    132: .Ft void
                    133: .Fn "evtimer_add" "struct event *ev" "struct timeval *"
                    134: .Ft void
                    135: .Fn "evtimer_del" "struct event *ev"
                    136: .Ft int
                    137: .Fn "evtimer_pending" "struct event *ev" "struct timeval *tv"
                    138: .Ft int
                    139: .Fn "evtimer_initialized" "struct event *ev"
                    140: .Ft void
                    141: .Fn "signal_set" "struct event *ev" "int signal" "void (*fn)(int, short, void *)" "void *arg"
                    142: .Ft void
                    143: .Fn "signal_add" "struct event *ev" "struct timeval *"
                    144: .Ft void
                    145: .Fn "signal_del" "struct event *ev"
                    146: .Ft int
                    147: .Fn "signal_pending" "struct event *ev" "struct timeval *tv"
                    148: .Ft int
                    149: .Fn "signal_initialized" "struct event *ev"
                    150: .Ft "struct bufferevent *"
                    151: .Fn "bufferevent_new" "int fd" "evbuffercb readcb" "evbuffercb writecb" "everrorcb" "void *cbarg"
                    152: .Ft void
                    153: .Fn "bufferevent_free" "struct bufferevent *bufev"
                    154: .Ft int
                    155: .Fn "bufferevent_write" "struct bufferevent *bufev" "void *data" "size_t size"
                    156: .Ft int
                    157: .Fn "bufferevent_write_buffer" "struct bufferevent *bufev" "struct evbuffer *buf"
                    158: .Ft size_t
                    159: .Fn "bufferevent_read" "struct bufferevent *bufev" "void *data" "size_t size"
                    160: .Ft int
                    161: .Fn "bufferevent_enable" "struct bufferevent *bufev" "short event"
                    162: .Ft int
                    163: .Fn "bufferevent_disable" "struct bufferevent *bufev" "short event"
                    164: .Ft void
                    165: .Fn "bufferevent_settimeout" "struct bufferevent *bufev" "int timeout_read" "int timeout_write"
                    166: .Ft int
                    167: .Fn "bufferevent_base_set" "struct event_base *base" "struct bufferevent *bufev"
                    168: .Ft "struct evbuffer *"
                    169: .Fn "evbuffer_new" "void"
                    170: .Ft void
                    171: .Fn "evbuffer_free" "struct evbuffer *buf"
                    172: .Ft int
                    173: .Fn "evbuffer_add" "struct evbuffer *buf" "const void *data" "size_t size"
                    174: .Ft int
                    175: .Fn "evbuffer_add_buffer" "struct evbuffer *dst" "struct evbuffer *src"
                    176: .Ft int
                    177: .Fn "evbuffer_add_printf" "struct evbuffer *buf" "const char *fmt" "..."
                    178: .Ft int
                    179: .Fn "evbuffer_add_vprintf" "struct evbuffer *buf" "const char *fmt" "va_list ap"
                    180: .Ft void
                    181: .Fn "evbuffer_drain" "struct evbuffer *buf" "size_t size"
                    182: .Ft int
                    183: .Fn "evbuffer_write" "struct evbuffer *buf" "int fd"
                    184: .Ft int
                    185: .Fn "evbuffer_read" "struct evbuffer *buf" "int fd" "int size"
                    186: .Ft "u_char *"
                    187: .Fn "evbuffer_find" "struct evbuffer *buf" "const u_char *data" "size_t size"
                    188: .Ft "char *"
                    189: .Fn "evbuffer_readline" "struct evbuffer *buf"
                    190: .Ft "struct evhttp *"
                    191: .Fn "evhttp_new" "struct event_base *base"
                    192: .Ft int
                    193: .Fn "evhttp_bind_socket" "struct evhttp *http" "const char *address" "u_short port"
                    194: .Ft "void"
                    195: .Fn "evhttp_free" "struct evhttp *http"
                    196: .Ft int
                    197: .Fa (*event_sigcb)(void) ;
                    198: .Ft volatile sig_atomic_t
                    199: .Fa event_gotsig ;
                    200: .Sh DESCRIPTION
                    201: The
                    202: .Nm event
                    203: API provides a mechanism to execute a function when a specific event
                    204: on a file descriptor occurs or after a given time has passed.
                    205: .Pp
                    206: The
                    207: .Nm event
                    208: API needs to be initialized with
                    209: .Fn event_init
                    210: before it can be used.
                    211: .Pp
                    212: In order to process events, an application needs to call
                    213: .Fn event_dispatch .
                    214: This function only returns on error, and should replace the event core
                    215: of the application program.
                    216: .Pp
                    217: The function
                    218: .Fn event_set
                    219: prepares the event structure
                    220: .Fa ev
                    221: to be used in future calls to
                    222: .Fn event_add
                    223: and
                    224: .Fn event_del .
                    225: The event will be prepared to call the function specified by the
                    226: .Fa fn
                    227: argument with an
                    228: .Fa int
                    229: argument indicating the file descriptor, a
                    230: .Fa short
                    231: argument indicating the type of event, and a
                    232: .Fa void *
                    233: argument given in the
                    234: .Fa arg
                    235: argument.
                    236: The
                    237: .Fa fd
                    238: indicates the file descriptor that should be monitored for events.
                    239: The events can be either
                    240: .Va EV_READ ,
                    241: .Va EV_WRITE ,
                    242: or both,
                    243: indicating that an application can read or write from the file descriptor
                    244: respectively without blocking.
                    245: .Pp
                    246: The function
                    247: .Fa fn
                    248: will be called with the file descriptor that triggered the event and
                    249: the type of event which will be either
                    250: .Va EV_TIMEOUT ,
                    251: .Va EV_SIGNAL ,
                    252: .Va EV_READ ,
                    253: or
                    254: .Va EV_WRITE .
                    255: Additionally, an event which has registered interest in more than one of the
                    256: preceeding events, via bitwise-OR to
                    257: .Fn event_set ,
                    258: can provide its callback function with a bitwise-OR of more than one triggered
                    259: event.
                    260: The additional flag
                    261: .Va EV_PERSIST
                    262: makes an
                    263: .Fn event_add
                    264: persistent until
                    265: .Fn event_del
                    266: has been called.
                    267: .Pp
                    268: Once initialized, the
                    269: .Fa ev
                    270: structure can be used repeatedly with
                    271: .Fn event_add
                    272: and
                    273: .Fn event_del
                    274: and does not need to be reinitialized unless the function called and/or
                    275: the argument to it are to be changed.
                    276: However, when an
                    277: .Fa ev
                    278: structure has been added to libevent using
                    279: .Fn event_add
                    280: the structure must persist until the event occurs (assuming
                    281: .Fa EV_PERSIST
                    282: is not set) or is removed
                    283: using
                    284: .Fn event_del .
                    285: You may not reuse the same
                    286: .Fa ev
                    287: structure for multiple monitored descriptors; each descriptor
                    288: needs its own
                    289: .Fa ev .
                    290: .Pp
                    291: The function
                    292: .Fn event_add
                    293: schedules the execution of the
                    294: .Fa ev
                    295: event when the event specified in
                    296: .Fn event_set
                    297: occurs or in at least the time specified in the
                    298: .Fa tv .
                    299: If
                    300: .Fa tv
                    301: is
                    302: .Dv NULL ,
                    303: no timeout occurs and the function will only be called
                    304: if a matching event occurs on the file descriptor.
                    305: The event in the
                    306: .Fa ev
                    307: argument must be already initialized by
                    308: .Fn event_set
                    309: and may not be used in calls to
                    310: .Fn event_set
                    311: until it has timed out or been removed with
                    312: .Fn event_del .
                    313: If the event in the
                    314: .Fa ev
                    315: argument already has a scheduled timeout, the old timeout will be
                    316: replaced by the new one.
                    317: .Pp
                    318: The function
                    319: .Fn event_del
                    320: will cancel the event in the argument
                    321: .Fa ev .
                    322: If the event has already executed or has never been added
                    323: the call will have no effect.
                    324: .Pp
                    325: The functions
                    326: .Fn evtimer_set ,
                    327: .Fn evtimer_add ,
                    328: .Fn evtimer_del ,
                    329: .Fn evtimer_initialized ,
                    330: and
                    331: .Fn evtimer_pending
                    332: are abbreviations for common situations where only a timeout is required.
                    333: The file descriptor passed will be \-1, and the event type will be
                    334: .Va EV_TIMEOUT .
                    335: .Pp
                    336: The functions
                    337: .Fn signal_set ,
                    338: .Fn signal_add ,
                    339: .Fn signal_del ,
                    340: .Fn signal_initialized ,
                    341: and
                    342: .Fn signal_pending
                    343: are abbreviations.
                    344: The event type will be a persistent
                    345: .Va EV_SIGNAL .
                    346: That means
                    347: .Fn signal_set
                    348: adds
                    349: .Va EV_PERSIST .
                    350: .Pp
                    351: In order to avoid races in signal handlers, the
                    352: .Nm event
                    353: API provides two variables:
                    354: .Va event_sigcb
                    355: and
                    356: .Va event_gotsig .
                    357: A signal handler
                    358: sets
                    359: .Va event_gotsig
                    360: to indicate that a signal has been received.
                    361: The application sets
                    362: .Va event_sigcb
                    363: to a callback function.
                    364: After the signal handler sets
                    365: .Va event_gotsig ,
                    366: .Nm event_dispatch
                    367: will execute the callback function to process received signals.
                    368: The callback returns 1 when no events are registered any more.
                    369: It can return \-1 to indicate an error to the
                    370: .Nm event
                    371: library, causing
                    372: .Fn event_dispatch
                    373: to terminate with
                    374: .Va errno
                    375: set to
                    376: .Er EINTR .
                    377: .Pp
                    378: The function
                    379: .Fn event_once
                    380: is similar to
                    381: .Fn event_set .
                    382: However, it schedules a callback to be called exactly once and does not
                    383: require the caller to prepare an
                    384: .Fa event
                    385: structure.
                    386: This function supports
                    387: .Fa EV_TIMEOUT ,
                    388: .Fa EV_READ ,
                    389: and
                    390: .Fa EV_WRITE .
                    391: .Pp
                    392: The
                    393: .Fn event_pending
                    394: function can be used to check if the event specified by
                    395: .Fa event
                    396: is pending to run.
                    397: If
                    398: .Va EV_TIMEOUT
                    399: was specified and
                    400: .Fa tv
                    401: is not
                    402: .Dv NULL ,
                    403: the expiration time of the event will be returned in
                    404: .Fa tv .
                    405: .Pp
                    406: The
                    407: .Fn event_initialized
                    408: macro can be used to check if an event has been initialized.
                    409: .Pp
                    410: The
                    411: .Nm event_loop
                    412: function provides an interface for single pass execution of pending
                    413: events.
                    414: The flags
                    415: .Va EVLOOP_ONCE
                    416: and
                    417: .Va EVLOOP_NONBLOCK
                    418: are recognized.
                    419: The
                    420: .Nm event_loopexit
                    421: function exits from the event loop. The next
                    422: .Fn event_loop
                    423: iteration after the
                    424: given timer expires will complete normally (handling all queued events) then
                    425: exit without blocking for events again. Subsequent invocations of
                    426: .Fn event_loop
                    427: will proceed normally.
                    428: The
                    429: .Nm event_loopbreak
                    430: function exits from the event loop immediately.
                    431: .Fn event_loop
                    432: will abort after the next event is completed;
                    433: .Fn event_loopbreak
                    434: is typically invoked from this event's callback. This behavior is analogous
                    435: to the "break;" statement. Subsequent invocations of
                    436: .Fn event_loop
                    437: will proceed normally.
                    438: .Pp
                    439: It is the responsibility of the caller to provide these functions with
                    440: pre-allocated event structures.
                    441: .Pp
                    442: .Sh EVENT PRIORITIES
                    443: By default
                    444: .Nm libevent
                    445: schedules all active events with the same priority.
                    446: However, sometimes it is desirable to process some events with a higher
                    447: priority than others.
                    448: For that reason,
                    449: .Nm libevent
                    450: supports strict priority queues.
                    451: Active events with a lower priority are always processed before events
                    452: with a higher priority.
                    453: .Pp
                    454: The number of different priorities can be set initially with the
                    455: .Fn event_priority_init
                    456: function.
                    457: This function should be called before the first call to
                    458: .Fn event_dispatch .
                    459: The
                    460: .Fn event_priority_set
                    461: function can be used to assign a priority to an event.
                    462: By default,
                    463: .Nm libevent
                    464: assigns the middle priority to all events unless their priority
                    465: is explicitly set.
                    466: .Sh THREAD SAFE EVENTS
                    467: .Nm Libevent
                    468: has experimental support for thread-safe events.
                    469: When initializing the library via
                    470: .Fn event_init ,
                    471: an event base is returned.
                    472: This event base can be used in conjunction with calls to
                    473: .Fn event_base_set ,
                    474: .Fn event_base_dispatch ,
                    475: .Fn event_base_loop ,
                    476: .Fn event_base_loopexit ,
                    477: .Fn bufferevent_base_set
                    478: and
                    479: .Fn event_base_free .
                    480: .Fn event_base_set
                    481: should be called after preparing an event with
                    482: .Fn event_set ,
                    483: as
                    484: .Fn event_set
                    485: assigns the provided event to the most recently created event base.
                    486: .Fn bufferevent_base_set
                    487: should be called after preparing a bufferevent with
                    488: .Fn bufferevent_new .
                    489: .Fn event_base_free
                    490: should be used to free memory associated with the event base
                    491: when it is no longer needed.
                    492: .Sh BUFFERED EVENTS
                    493: .Nm libevent
                    494: provides an abstraction on top of the regular event callbacks.
                    495: This abstraction is called a
                    496: .Va "buffered event" .
                    497: A buffered event provides input and output buffers that get filled
                    498: and drained automatically.
                    499: The user of a buffered event no longer deals directly with the IO,
                    500: but instead is reading from input and writing to output buffers.
                    501: .Pp
                    502: A new bufferevent is created by
                    503: .Fn bufferevent_new .
                    504: The parameter
                    505: .Fa fd
                    506: specifies the file descriptor from which data is read and written to.
                    507: This file descriptor is not allowed to be a
                    508: .Xr pipe 2 .
                    509: The next three parameters are callbacks.
                    510: The read and write callback have the following form:
                    511: .Ft void
                    512: .Fn "(*cb)" "struct bufferevent *bufev" "void *arg" .
                    513: The error callback has the following form:
                    514: .Ft void
                    515: .Fn "(*cb)" "struct bufferevent *bufev" "short what" "void *arg" .
                    516: The argument is specified by the fourth parameter
                    517: .Fa "cbarg" .
                    518: A
                    519: .Fa bufferevent struct
                    520: pointer is returned on success, NULL on error.
                    521: Both the read and the write callback may be NULL.
                    522: The error callback has to be always provided.
                    523: .Pp
                    524: Once initialized, the bufferevent structure can be used repeatedly with
                    525: bufferevent_enable() and bufferevent_disable().
                    526: The flags parameter can be a combination of
                    527: .Va EV_READ
                    528: and
                    529: .Va EV_WRITE .
                    530: When read enabled the bufferevent will try to read from the file
                    531: descriptor and call the read callback.
                    532: The write callback is executed
                    533: whenever the output buffer is drained below the write low watermark,
                    534: which is
                    535: .Va 0
                    536: by default.
                    537: .Pp
                    538: The
                    539: .Fn bufferevent_write
                    540: function can be used to write data to the file descriptor.
                    541: The data is appended to the output buffer and written to the descriptor
                    542: automatically as it becomes available for writing.
                    543: .Fn bufferevent_write
                    544: returns 0 on success or \-1 on failure.
                    545: The
                    546: .Fn bufferevent_read
                    547: function is used to read data from the input buffer,
                    548: returning the amount of data read.
                    549: .Pp
                    550: If multiple bases are in use, bufferevent_base_set() must be called before
                    551: enabling the bufferevent for the first time.
                    552: .Sh NON-BLOCKING HTTP SUPPORT
                    553: .Nm libevent
                    554: provides a very thin HTTP layer that can be used both to host an HTTP
                    555: server and also to make HTTP requests.
                    556: An HTTP server can be created by calling
                    557: .Fn evhttp_new .
                    558: It can be bound to any port and address with the
                    559: .Fn evhttp_bind_socket
                    560: function.
                    561: When the HTTP server is no longer used, it can be freed via
                    562: .Fn evhttp_free .
                    563: .Pp
                    564: To be notified of HTTP requests, a user needs to register callbacks with the
                    565: HTTP server.
                    566: This can be done by calling
                    567: .Fn evhttp_set_cb .
                    568: The second argument is the URI for which a callback is being registered.
                    569: The corresponding callback will receive an
                    570: .Va struct evhttp_request
                    571: object that contains all information about the request.
                    572: .Pp
                    573: This section does not document all the possible function calls; please
                    574: check
                    575: .Va event.h
                    576: for the public interfaces.
                    577: .Sh ADDITIONAL NOTES
                    578: It is possible to disable support for
                    579: .Va epoll , kqueue , devpoll , poll
                    580: or
                    581: .Va select
                    582: by setting the environment variable
                    583: .Va EVENT_NOEPOLL , EVENT_NOKQUEUE , EVENT_NODEVPOLL , EVENT_NOPOLL
                    584: or
                    585: .Va EVENT_NOSELECT ,
                    586: respectively.
                    587: By setting the environment variable
                    588: .Va EVENT_SHOW_METHOD ,
                    589: .Nm libevent
                    590: displays the kernel notification method that it uses.
                    591: .Sh RETURN VALUES
                    592: Upon successful completion
                    593: .Fn event_add
                    594: and
                    595: .Fn event_del
                    596: return 0.
                    597: Otherwise, \-1 is returned and the global variable errno is
                    598: set to indicate the error.
                    599: .Sh SEE ALSO
                    600: .Xr kqueue 2 ,
                    601: .Xr poll 2 ,
                    602: .Xr select 2 ,
                    603: .Xr evdns 3 ,
                    604: .Xr timeout 9
                    605: .Sh HISTORY
                    606: The
                    607: .Nm event
                    608: API manpage is based on the
                    609: .Xr timeout 9
                    610: manpage by Artur Grabowski.
                    611: The port of
                    612: .Nm libevent
                    613: to Windows is due to Michael A. Davis.
                    614: Support for real-time signals is due to Taral.
                    615: .Sh AUTHORS
                    616: The
                    617: .Nm event
                    618: library was written by Niels Provos.
                    619: .Sh BUGS
                    620: This documentation is neither complete nor authoritative.
                    621: If you are in doubt about the usage of this API then
                    622: check the source code to find out how it works, write
                    623: up the missing piece of documentation and send it to
                    624: me for inclusion in this man page.

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>