File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libevent / event.3
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 23:02:54 2012 UTC (12 years, 3 months ago) by misho
Branches: libevent, MAIN
CVS tags: v1_4_14bp0, v1_4_14b, HEAD
libevent

    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>