From 9265226edb9bb3d78b5fb0255634878ace52d832 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 12 Dec 2007 22:26:37 +0000 Subject: *** empty log message *** --- ev.html | 2550 ------------------------------------------------------- ev.pod | 12 +- import_libevent | 2 +- 3 files changed, 7 insertions(+), 2557 deletions(-) delete mode 100644 ev.html diff --git a/ev.html b/ev.html deleted file mode 100644 index 8e25f60..0000000 --- a/ev.html +++ /dev/null @@ -1,2550 +0,0 @@ - - - - - libev - - - - - - - -
- -

Index

- -
- - -

NAME

-
-

libev - a high performance full-featured event loop written in C

- -
-

SYNOPSIS

-
-
  #include <ev.h>
-
-
- -
-

EXAMPLE PROGRAM

-
-
  #include <ev.h>
-
-  ev_io stdin_watcher;
-  ev_timer timeout_watcher;
-
-  /* called when data readable on stdin */
-  static void
-  stdin_cb (EV_P_ struct ev_io *w, int revents)
-  {
-    /* puts ("stdin ready"); */
-    ev_io_stop (EV_A_ w); /* just a syntax example */
-    ev_unloop (EV_A_ EVUNLOOP_ALL); /* leave all loop calls */
-  }
-
-  static void
-  timeout_cb (EV_P_ struct ev_timer *w, int revents)
-  {
-    /* puts ("timeout"); */
-    ev_unloop (EV_A_ EVUNLOOP_ONE); /* leave one loop call */
-  }
-
-  int
-  main (void)
-  {
-    struct ev_loop *loop = ev_default_loop (0);
-
-    /* initialise an io watcher, then start it */
-    ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ 0, EV_READ);
-    ev_io_start (loop, &stdin_watcher);
-
-    /* simple non-repeating 5.5 second timeout */
-    ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.);
-    ev_timer_start (loop, &timeout_watcher);
-
-    /* loop till timeout or data ready */
-    ev_loop (loop, 0);
-
-    return 0;
-  }
-
-
- -
-

DESCRIPTION

-
-

The newest version of this document is also available as a html-formatted -web page you might find easier to navigate when reading it for the first -time: http://cvs.schmorp.de/libev/ev.html.

-

Libev is an event loop: you register interest in certain events (such as a -file descriptor being readable or a timeout occuring), and it will manage -these event sources and provide your program with events.

-

To do this, it must take more or less complete control over your process -(or thread) by executing the event loop handler, and will then -communicate events via a callback mechanism.

-

You register interest in certain events by registering so-called event -watchers, which are relatively small C structures you initialise with the -details of the event, and then hand it over to libev by starting the -watcher.

- -
-

FEATURES

-
-

Libev supports select, poll, the Linux-specific epoll, the -BSD-specific kqueue and the Solaris-specific event port mechanisms -for file descriptor events (ev_io), the Linux inotify interface -(for ev_stat), relative timers (ev_timer), absolute timers -with customised rescheduling (ev_periodic), synchronous signals -(ev_signal), process status change events (ev_child), and event -watchers dealing with the event loop mechanism itself (ev_idle, -ev_embed, ev_prepare and ev_check watchers) as well as -file watchers (ev_stat) and even limited support for fork events -(ev_fork).

-

It also is quite fast (see this -benchmark comparing it to libevent -for example).

- -
-

CONVENTIONS

-
-

Libev is very configurable. In this manual the default configuration will -be described, which supports multiple event loops. For more info about -various configuration options please have a look at EMBED section in -this manual. If libev was configured without support for multiple event -loops, then all functions taking an initial argument of name loop -(which is always of type struct ev_loop *) will not have this argument.

- -
-

TIME REPRESENTATION

-
-

Libev represents time as a single floating point number, representing the -(fractional) number of seconds since the (POSIX) epoch (somewhere near -the beginning of 1970, details are complicated, don't ask). This type is -called ev_tstamp, which is what you should use too. It usually aliases -to the double type in C, and when you need to do any calculations on -it, you should treat it as such.

- -
-

GLOBAL FUNCTIONS

-
-

These functions can be called anytime, even before initialising the -library in any way.

-
-
ev_tstamp ev_time ()
-
-

Returns the current time as libev would use it. Please note that the -ev_now function is usually faster and also often returns the timestamp -you actually want to know.

-
-
int ev_version_major ()
-
int ev_version_minor ()
-
-

You can find out the major and minor ABI version numbers of the library -you linked against by calling the functions ev_version_major and -ev_version_minor. If you want, you can compare against the global -symbols EV_VERSION_MAJOR and EV_VERSION_MINOR, which specify the -version of the library your program was compiled against.

-

These version numbers refer to the ABI version of the library, not the -release version.

-

Usually, it's a good idea to terminate if the major versions mismatch, -as this indicates an incompatible change. Minor versions are usually -compatible to older versions, so a larger minor version alone is usually -not a problem.

-

Example: Make sure we haven't accidentally been linked against the wrong -version.

-
  assert (("libev version mismatch",
-           ev_version_major () == EV_VERSION_MAJOR
-           && ev_version_minor () >= EV_VERSION_MINOR));
-
-
-
-
unsigned int ev_supported_backends ()
-
-

Return the set of all backends (i.e. their corresponding EV_BACKEND_* -value) compiled into this binary of libev (independent of their -availability on the system you are running on). See ev_default_loop for -a description of the set values.

-

Example: make sure we have the epoll method, because yeah this is cool and -a must have and can we have a torrent of it please!!!11

-
  assert (("sorry, no epoll, no sex",
-           ev_supported_backends () & EVBACKEND_EPOLL));
-
-
-
-
unsigned int ev_recommended_backends ()
-
-

Return the set of all backends compiled into this binary of libev and also -recommended for this platform. This set is often smaller than the one -returned by ev_supported_backends, as for example kqueue is broken on -most BSDs and will not be autodetected unless you explicitly request it -(assuming you know what you are doing). This is the set of backends that -libev will probe for if you specify no backends explicitly.

-
-
unsigned int ev_embeddable_backends ()
-
-

Returns the set of backends that are embeddable in other event loops. This -is the theoretical, all-platform, value. To find which backends -might be supported on the current system, you would need to look at -ev_embeddable_backends () & ev_supported_backends (), likewise for -recommended ones.

-

See the description of ev_embed watchers for more info.

-
-
ev_set_allocator (void *(*cb)(void *ptr, long size))
-
-

Sets the allocation function to use (the prototype is similar - the -semantics is identical - to the realloc C function). It is used to -allocate and free memory (no surprises here). If it returns zero when -memory needs to be allocated, the library might abort or take some -potentially destructive action. The default is your system realloc -function.

-

You could override this function in high-availability programs to, say, -free some memory if it cannot allocate memory, to use a special allocator, -or even to sleep a while and retry until some memory is available.

-

Example: Replace the libev allocator with one that waits a bit and then -retries).

-
   static void *
-   persistent_realloc (void *ptr, size_t size)
-   {
-     for (;;)
-       {
-         void *newptr = realloc (ptr, size);
-
-         if (newptr)
-           return newptr;
-
-         sleep (60);
-       }
-   }
-
-   ...
-   ev_set_allocator (persistent_realloc);
-
-
-
-
ev_set_syserr_cb (void (*cb)(const char *msg));
-
-

Set the callback function to call on a retryable syscall error (such -as failed select, poll, epoll_wait). The message is a printable string -indicating the system call or subsystem causing the problem. If this -callback is set, then libev will expect it to remedy the sitution, no -matter what, when it returns. That is, libev will generally retry the -requested operation, or, if the condition doesn't go away, do bad stuff -(such as abort).

-

Example: This is basically the same thing that libev does internally, too.

-
   static void
-   fatal_error (const char *msg)
-   {
-     perror (msg);
-     abort ();
-   }
-
-   ...
-   ev_set_syserr_cb (fatal_error);
-
-
-
-
- -
-

FUNCTIONS CONTROLLING THE EVENT LOOP

-
-

An event loop is described by a struct ev_loop *. The library knows two -types of such loops, the default loop, which supports signals and child -events, and dynamically created loops which do not.

-

If you use threads, a common model is to run the default event loop -in your main thread (or in a separate thread) and for each thread you -create, you also create another event loop. Libev itself does no locking -whatsoever, so if you mix calls to the same event loop in different -threads, make sure you lock (this is usually a bad idea, though, even if -done correctly, because it's hideous and inefficient).

-
-
struct ev_loop *ev_default_loop (unsigned int flags)
-
-

This will initialise the default event loop if it hasn't been initialised -yet and return it. If the default loop could not be initialised, returns -false. If it already was initialised it simply returns it (and ignores the -flags. If that is troubling you, check ev_backend () afterwards).

-

If you don't know what event loop to use, use the one returned from this -function.

-

The flags argument can be used to specify special behaviour or specific -backends to use, and is usually specified as 0 (or EVFLAG_AUTO).

-

The following flags are supported:

-

-

-
EVFLAG_AUTO
-
-

The default flags value. Use this if you have no clue (it's the right -thing, believe me).

-
-
EVFLAG_NOENV
-
-

If this flag bit is ored into the flag value (or the program runs setuid -or setgid) then libev will not look at the environment variable -LIBEV_FLAGS. Otherwise (the default), this environment variable will -override the flags completely if it is found in the environment. This is -useful to try out specific backends to test their performance, or to work -around bugs.

-
-
EVFLAG_FORKCHECK
-
-

Instead of calling ev_default_fork or ev_loop_fork manually after -a fork, you can also make libev check for a fork in each iteration by -enabling this flag.

-

This works by calling getpid () on every iteration of the loop, -and thus this might slow down your event loop if you do a lot of loop -iterations and little real work, but is usually not noticeable (on my -Linux system for example, getpid is actually a simple 5-insn sequence -without a syscall and thus very fast, but my Linux system also has -pthread_atfork which is even faster).

-

The big advantage of this flag is that you can forget about fork (and -forget about forgetting to tell libev about forking) when you use this -flag.

-

This flag setting cannot be overriden or specified in the LIBEV_FLAGS -environment variable.

-
-
EVBACKEND_SELECT (value 1, portable select backend)
-
-

This is your standard select(2) backend. Not completely standard, as -libev tries to roll its own fd_set with no limits on the number of fds, -but if that fails, expect a fairly low limit on the number of fds when -using this backend. It doesn't scale too well (O(highest_fd)), but its usually -the fastest backend for a low number of fds.

-
-
EVBACKEND_POLL (value 2, poll backend, available everywhere except on windows)
-
-

And this is your standard poll(2) backend. It's more complicated than -select, but handles sparse fds better and has no artificial limit on the -number of fds you can use (except it will slow down considerably with a -lot of inactive fds). It scales similarly to select, i.e. O(total_fds).

-
-
EVBACKEND_EPOLL (value 4, Linux)
-
-

For few fds, this backend is a bit little slower than poll and select, -but it scales phenomenally better. While poll and select usually scale like -O(total_fds) where n is the total number of fds (or the highest fd), epoll scales -either O(1) or O(active_fds).

-

While stopping and starting an I/O watcher in the same iteration will -result in some caching, there is still a syscall per such incident -(because the fd could point to a different file description now), so its -best to avoid that. Also, dup()ed file descriptors might not work very -well if you register events for both fds.

-

Please note that epoll sometimes generates spurious notifications, so you -need to use non-blocking I/O or other means to avoid blocking when no data -(or space) is available.

-
-
EVBACKEND_KQUEUE (value 8, most BSD clones)
-
-

Kqueue deserves special mention, as at the time of this writing, it -was broken on all BSDs except NetBSD (usually it doesn't work with -anything but sockets and pipes, except on Darwin, where of course its -completely useless). For this reason its not being "autodetected" -unless you explicitly specify it explicitly in the flags (i.e. using -EVBACKEND_KQUEUE).

-

It scales in the same way as the epoll backend, but the interface to the -kernel is more efficient (which says nothing about its actual speed, of -course). While starting and stopping an I/O watcher does not cause an -extra syscall as with epoll, it still adds up to four event changes per -incident, so its best to avoid that.

-
-
EVBACKEND_DEVPOLL (value 16, Solaris 8)
-
-

This is not implemented yet (and might never be).

-
-
EVBACKEND_PORT (value 32, Solaris 10)
-
-

This uses the Solaris 10 port mechanism. As with everything on Solaris, -it's really slow, but it still scales very well (O(active_fds)).

-

Please note that solaris ports can result in a lot of spurious -notifications, so you need to use non-blocking I/O or other means to avoid -blocking when no data (or space) is available.

-
-
EVBACKEND_ALL
-
-

Try all backends (even potentially broken ones that wouldn't be tried -with EVFLAG_AUTO). Since this is a mask, you can do stuff such as -EVBACKEND_ALL & ~EVBACKEND_KQUEUE.

-
-
-

-

If one or more of these are ored into the flags value, then only these -backends will be tried (in the reverse order as given here). If none are -specified, most compiled-in backend will be tried, usually in reverse -order of their flag values :)

-

The most typical usage is like this:

-
  if (!ev_default_loop (0))
-    fatal ("could not initialise libev, bad $LIBEV_FLAGS in environment?");
-
-
-

Restrict libev to the select and poll backends, and do not allow -environment settings to be taken into account:

-
  ev_default_loop (EVBACKEND_POLL | EVBACKEND_SELECT | EVFLAG_NOENV);
-
-
-

Use whatever libev has to offer, but make sure that kqueue is used if -available (warning, breaks stuff, best use only with your own private -event loop and only if you know the OS supports your types of fds):

-
  ev_default_loop (ev_recommended_backends () | EVBACKEND_KQUEUE);
-
-
-
-
struct ev_loop *ev_loop_new (unsigned int flags)
-
-

Similar to ev_default_loop, but always creates a new event loop that is -always distinct from the default loop. Unlike the default loop, it cannot -handle signal and child watchers, and attempts to do so will be greeted by -undefined behaviour (or a failed assertion if assertions are enabled).

-

Example: Try to create a event loop that uses epoll and nothing else.

-
  struct ev_loop *epoller = ev_loop_new (EVBACKEND_EPOLL | EVFLAG_NOENV);
-  if (!epoller)
-    fatal ("no epoll found here, maybe it hides under your chair");
-
-
-
-
ev_default_destroy ()
-
-

Destroys the default loop again (frees all memory and kernel state -etc.). None of the active event watchers will be stopped in the normal -sense, so e.g. ev_is_active might still return true. It is your -responsibility to either stop all watchers cleanly yoursef before -calling this function, or cope with the fact afterwards (which is usually -the easiest thing, youc na just ignore the watchers and/or free () them -for example).

-
-
ev_loop_destroy (loop)
-
-

Like ev_default_destroy, but destroys an event loop created by an -earlier call to ev_loop_new.

-
-
ev_default_fork ()
-
-

This function reinitialises the kernel state for backends that have -one. Despite the name, you can call it anytime, but it makes most sense -after forking, in either the parent or child process (or both, but that -again makes little sense).

-

You must call this function in the child process after forking if and -only if you want to use the event library in both processes. If you just -fork+exec, you don't have to call it.

-

The function itself is quite fast and it's usually not a problem to call -it just in case after a fork. To make this easy, the function will fit in -quite nicely into a call to pthread_atfork:

-
    pthread_atfork (0, 0, ev_default_fork);
-
-
-

At the moment, EVBACKEND_SELECT and EVBACKEND_POLL are safe to use -without calling this function, so if you force one of those backends you -do not need to care.

-
-
ev_loop_fork (loop)
-
-

Like ev_default_fork, but acts on an event loop created by -ev_loop_new. Yes, you have to call this on every allocated event loop -after fork, and how you do this is entirely your own problem.

-
-
unsigned int ev_loop_count (loop)
-
-

Returns the count of loop iterations for the loop, which is identical to -the number of times libev did poll for new events. It starts at 0 and -happily wraps around with enough iterations.

-

This value can sometimes be useful as a generation counter of sorts (it -"ticks" the number of loop iterations), as it roughly corresponds with -ev_prepare and ev_check calls.

-
-
unsigned int ev_backend (loop)
-
-

Returns one of the EVBACKEND_* flags indicating the event backend in -use.

-
-
ev_tstamp ev_now (loop)
-
-

Returns the current "event loop time", which is the time the event loop -received events and started processing them. This timestamp does not -change as long as callbacks are being processed, and this is also the base -time used for relative timers. You can treat it as the timestamp of the -event occuring (or more correctly, libev finding out about it).

-
-
ev_loop (loop, int flags)
-
-

Finally, this is it, the event handler. This function usually is called -after you initialised all your watchers and you want to start handling -events.

-

If the flags argument is specified as 0, it will not return until -either no event watchers are active anymore or ev_unloop was called.

-

Please note that an explicit ev_unloop is usually better than -relying on all watchers to be stopped when deciding when a program has -finished (especially in interactive programs), but having a program that -automatically loops as long as it has to and no longer by virtue of -relying on its watchers stopping correctly is a thing of beauty.

-

A flags value of EVLOOP_NONBLOCK will look for new events, will handle -those events and any outstanding ones, but will not block your process in -case there are no events and will return after one iteration of the loop.

-

A flags value of EVLOOP_ONESHOT will look for new events (waiting if -neccessary) and will handle those and any outstanding ones. It will block -your process until at least one new event arrives, and will return after -one iteration of the loop. This is useful if you are waiting for some -external event in conjunction with something not expressible using other -libev watchers. However, a pair of ev_prepare/ev_check watchers is -usually a better approach for this kind of thing.

-

Here are the gory details of what ev_loop does:

-
   - Before the first iteration, call any pending watchers.
-   * If there are no active watchers (reference count is zero), return.
-   - Queue all prepare watchers and then call all outstanding watchers.
-   - If we have been forked, recreate the kernel state.
-   - Update the kernel state with all outstanding changes.
-   - Update the "event loop time".
-   - Calculate for how long to block.
-   - Block the process, waiting for any events.
-   - Queue all outstanding I/O (fd) events.
-   - Update the "event loop time" and do time jump handling.
-   - Queue all outstanding timers.
-   - Queue all outstanding periodics.
-   - If no events are pending now, queue all idle watchers.
-   - Queue all check watchers.
-   - Call all queued watchers in reverse order (i.e. check watchers first).
-     Signals and child watchers are implemented as I/O watchers, and will
-     be handled here by queueing them when their watcher gets executed.
-   - If ev_unloop has been called or EVLOOP_ONESHOT or EVLOOP_NONBLOCK
-     were used, return, otherwise continue with step *.
-
-
-

Example: Queue some jobs and then loop until no events are outsanding -anymore.

-
   ... queue jobs here, make sure they register event watchers as long
-   ... as they still have work to do (even an idle watcher will do..)
-   ev_loop (my_loop, 0);
-   ... jobs done. yeah!
-
-
-
-
ev_unloop (loop, how)
-
-

Can be used to make a call to ev_loop return early (but only after it -has processed all outstanding events). The how argument must be either -EVUNLOOP_ONE, which will make the innermost ev_loop call return, or -EVUNLOOP_ALL, which will make all nested ev_loop calls return.

-
-
ev_ref (loop)
-
ev_unref (loop)
-
-

Ref/unref can be used to add or remove a reference count on the event -loop: Every watcher keeps one reference, and as long as the reference -count is nonzero, ev_loop will not return on its own. If you have -a watcher you never unregister that should not keep ev_loop from -returning, ev_unref() after starting, and ev_ref() before stopping it. For -example, libev itself uses this for its internal signal pipe: It is not -visible to the libev user and should not keep ev_loop from exiting if -no event watchers registered by it are active. It is also an excellent -way to do this for generic recurring timers or from within third-party -libraries. Just remember to unref after start and ref before stop.

-

Example: Create a signal watcher, but keep it from keeping ev_loop -running when nothing else is active.

-
  struct ev_signal exitsig;
-  ev_signal_init (&exitsig, sig_cb, SIGINT);
-  ev_signal_start (loop, &exitsig);
-  evf_unref (loop);
-
-
-

Example: For some weird reason, unregister the above signal handler again.

-
  ev_ref (loop);
-  ev_signal_stop (loop, &exitsig);
-
-
-
-
- - - - - -
-

ANATOMY OF A WATCHER

-
-

A watcher is a structure that you create and register to record your -interest in some event. For instance, if you want to wait for STDIN to -become readable, you would create an ev_io watcher for that:

-
  static void my_cb (struct ev_loop *loop, struct ev_io *w, int revents)
-  {
-    ev_io_stop (w);
-    ev_unloop (loop, EVUNLOOP_ALL);
-  }
-
-  struct ev_loop *loop = ev_default_loop (0);
-  struct ev_io stdin_watcher;
-  ev_init (&stdin_watcher, my_cb);
-  ev_io_set (&stdin_watcher, STDIN_FILENO, EV_READ);
-  ev_io_start (loop, &stdin_watcher);
-  ev_loop (loop, 0);
-
-
-

As you can see, you are responsible for allocating the memory for your -watcher structures (and it is usually a bad idea to do this on the stack, -although this can sometimes be quite valid).

-

Each watcher structure must be initialised by a call to ev_init -(watcher *, callback), which expects a callback to be provided. This -callback gets invoked each time the event occurs (or, in the case of io -watchers, each time the event loop detects that the file descriptor given -is readable and/or writable).

-

Each watcher type has its own ev_<type>_set (watcher *, ...) macro -with arguments specific to this watcher type. There is also a macro -to combine initialisation and setting in one call: ev_<type>_init -(watcher *, callback, ...).

-

To make the watcher actually watch out for events, you have to start it -with a watcher-specific start function (ev_<type>_start (loop, watcher -*)), and you can stop watching for events at any time by calling the -corresponding stop function (ev_<type>_stop (loop, watcher *).

-

As long as your watcher is active (has been started but not stopped) you -must not touch the values stored in it. Most specifically you must never -reinitialise it or call its set macro.

-

Each and every callback receives the event loop pointer as first, the -registered watcher structure as second, and a bitset of received events as -third argument.

-

The received events usually include a single bit per event type received -(you can receive multiple events at the same time). The possible bit masks -are:

-
-
EV_READ
-
EV_WRITE
-
-

The file descriptor in the ev_io watcher has become readable and/or -writable.

-
-
EV_TIMEOUT
-
-

The ev_timer watcher has timed out.

-
-
EV_PERIODIC
-
-

The ev_periodic watcher has timed out.

-
-
EV_SIGNAL
-
-

The signal specified in the ev_signal watcher has been received by a thread.

-
-
EV_CHILD
-
-

The pid specified in the ev_child watcher has received a status change.

-
-
EV_STAT
-
-

The path specified in the ev_stat watcher changed its attributes somehow.

-
-
EV_IDLE
-
-

The ev_idle watcher has determined that you have nothing better to do.

-
-
EV_PREPARE
-
EV_CHECK
-
-

All ev_prepare watchers are invoked just before ev_loop starts -to gather new events, and all ev_check watchers are invoked just after -ev_loop has gathered them, but before it invokes any callbacks for any -received events. Callbacks of both watcher types can start and stop as -many watchers as they want, and all of them will be taken into account -(for example, a ev_prepare watcher might start an idle watcher to keep -ev_loop from blocking).

-
-
EV_EMBED
-
-

The embedded event loop specified in the ev_embed watcher needs attention.

-
-
EV_FORK
-
-

The event loop has been resumed in the child process after fork (see -ev_fork).

-
-
EV_ERROR
-
-

An unspecified error has occured, the watcher has been stopped. This might -happen because the watcher could not be properly started because libev -ran out of memory, a file descriptor was found to be closed or any other -problem. You best act on it by reporting the problem and somehow coping -with the watcher being stopped.

-

Libev will usually signal a few "dummy" events together with an error, -for example it might indicate that a fd is readable or writable, and if -your callbacks is well-written it can just attempt the operation and cope -with the error from read() or write(). This will not work in multithreaded -programs, though, so beware.

-
-
- -
-

GENERIC WATCHER FUNCTIONS

-
-

In the following description, TYPE stands for the watcher type, -e.g. timer for ev_timer watchers and io for ev_io watchers.

-
-
ev_init (ev_TYPE *watcher, callback)
-
-

This macro initialises the generic portion of a watcher. The contents -of the watcher object can be arbitrary (so malloc will do). Only -the generic parts of the watcher are initialised, you need to call -the type-specific ev_TYPE_set macro afterwards to initialise the -type-specific parts. For each type there is also a ev_TYPE_init macro -which rolls both calls into one.

-

You can reinitialise a watcher at any time as long as it has been stopped -(or never started) and there are no pending events outstanding.

-

The callback is always of type void (*)(ev_loop *loop, ev_TYPE *watcher, -int revents).

-
-
ev_TYPE_set (ev_TYPE *, [args])
-
-

This macro initialises the type-specific parts of a watcher. You need to -call ev_init at least once before you call this macro, but you can -call ev_TYPE_set any number of times. You must not, however, call this -macro on a watcher that is active (it can be pending, however, which is a -difference to the ev_init macro).

-

Although some watcher types do not have type-specific arguments -(e.g. ev_prepare) you still need to call its set macro.

-
-
ev_TYPE_init (ev_TYPE *watcher, callback, [args])
-
-

This convinience macro rolls both ev_init and ev_TYPE_set macro -calls into a single call. This is the most convinient method to initialise -a watcher. The same limitations apply, of course.

-
-
ev_TYPE_start (loop *, ev_TYPE *watcher)
-
-

Starts (activates) the given watcher. Only active watchers will receive -events. If the watcher is already active nothing will happen.

-
-
ev_TYPE_stop (loop *, ev_TYPE *watcher)
-
-

Stops the given watcher again (if active) and clears the pending -status. It is possible that stopped watchers are pending (for example, -non-repeating timers are being stopped when they become pending), but -ev_TYPE_stop ensures that the watcher is neither active nor pending. If -you want to free or reuse the memory used by the watcher it is therefore a -good idea to always call its ev_TYPE_stop function.

-
-
bool ev_is_active (ev_TYPE *watcher)
-
-

Returns a true value iff the watcher is active (i.e. it has been started -and not yet been stopped). As long as a watcher is active you must not modify -it.

-
-
bool ev_is_pending (ev_TYPE *watcher)
-
-

Returns a true value iff the watcher is pending, (i.e. it has outstanding -events but its callback has not yet been invoked). As long as a watcher -is pending (but not active) you must not call an init function on it (but -ev_TYPE_set is safe), you must not change its priority, and you must -make sure the watcher is available to libev (e.g. you cannot free () -it).

-
-
callback ev_cb (ev_TYPE *watcher)
-
-

Returns the callback currently set on the watcher.

-
-
ev_cb_set (ev_TYPE *watcher, callback)
-
-

Change the callback. You can change the callback at virtually any time -(modulo threads).

-
-
ev_set_priority (ev_TYPE *watcher, priority)
-
int ev_priority (ev_TYPE *watcher)
-
-

Set and query the priority of the watcher. The priority is a small -integer between EV_MAXPRI (default: 2) and EV_MINPRI -(default: -2). Pending watchers with higher priority will be invoked -before watchers with lower priority, but priority will not keep watchers -from being executed (except for ev_idle watchers).

-

This means that priorities are only used for ordering callback -invocation after new events have been received. This is useful, for -example, to reduce latency after idling, or more often, to bind two -watchers on the same event and make sure one is called first.

-

If you need to suppress invocation when higher priority events are pending -you need to look at ev_idle watchers, which provide this functionality.

-

You must not change the priority of a watcher as long as it is active or -pending.

-

The default priority used by watchers when no priority has been set is -always 0, which is supposed to not be too high and not be too low :).

-

Setting a priority outside the range of EV_MINPRI to EV_MAXPRI is -fine, as long as you do not mind that the priority value you query might -or might not have been adjusted to be within valid range.

-
-
ev_invoke (loop, ev_TYPE *watcher, int revents)
-
-

Invoke the watcher with the given loop and revents. Neither -loop nor revents need to be valid as long as the watcher callback -can deal with that fact.

-
-
int ev_clear_pending (loop, ev_TYPE *watcher)
-
-

If the watcher is pending, this function returns clears its pending status -and returns its revents bitset (as if its callback was invoked). If the -watcher isn't pending it does nothing and returns 0.

-
-
- - - - - -
-

ASSOCIATING CUSTOM DATA WITH A WATCHER

-
-

Each watcher has, by default, a member void *data that you can change -and read at any time, libev will completely ignore it. This can be used -to associate arbitrary data with your watcher. If you need more data and -don't want to allocate memory and store a pointer to it in that data -member, you can also "subclass" the watcher type and provide your own -data:

-
  struct my_io
-  {
-    struct ev_io io;
-    int otherfd;
-    void *somedata;
-    struct whatever *mostinteresting;
-  }
-
-
-

And since your callback will be called with a pointer to the watcher, you -can cast it back to your own type:

-
  static void my_cb (struct ev_loop *loop, struct ev_io *w_, int revents)
-  {
-    struct my_io *w = (struct my_io *)w_;
-    ...
-  }
-
-
-

More interesting and less C-conformant ways of casting your callback type -instead have been omitted.

-

Another common scenario is having some data structure with multiple -watchers:

-
  struct my_biggy
-  {
-    int some_data;
-    ev_timer t1;
-    ev_timer t2;
-  }
-
-
-

In this case getting the pointer to my_biggy is a bit more complicated, -you need to use offsetof:

-
  #include <stddef.h>
-
-  static void
-  t1_cb (EV_P_ struct ev_timer *w, int revents)
-  {
-    struct my_biggy big = (struct my_biggy *
-      (((char *)w) - offsetof (struct my_biggy, t1));
-  }
-
-  static void
-  t2_cb (EV_P_ struct ev_timer *w, int revents)
-  {
-    struct my_biggy big = (struct my_biggy *
-      (((char *)w) - offsetof (struct my_biggy, t2));
-  }
-
-
-
-
-
- -
-

WATCHER TYPES

-
-

This section describes each watcher in detail, but will not repeat -information given in the last section. Any initialisation/set macros, -functions and members specific to the watcher type are explained.

-

Members are additionally marked with either [read-only], meaning that, -while the watcher is active, you can look at the member and expect some -sensible content, but you must not modify it (you can modify it while the -watcher is stopped to your hearts content), or [read-write], which -means you can expect it to have some sensible content while the watcher -is active, but you can also modify it. Modifying it may not do something -sensible or take immediate effect (or do anything at all), but libev will -not crash or malfunction in any way.

- - - - - -
-

ev_io - is this file descriptor readable or writable?

-
-

I/O watchers check whether a file descriptor is readable or writable -in each iteration of the event loop, or, more precisely, when reading -would not block the process and writing would at least be able to write -some data. This behaviour is called level-triggering because you keep -receiving events as long as the condition persists. Remember you can stop -the watcher if you don't want to act on the event and neither want to -receive future events.

-

In general you can register as many read and/or write event watchers per -fd as you want (as long as you don't confuse yourself). Setting all file -descriptors to non-blocking mode is also usually a good idea (but not -required if you know what you are doing).

-

You have to be careful with dup'ed file descriptors, though. Some backends -(the linux epoll backend is a notable example) cannot handle dup'ed file -descriptors correctly if you register interest in two or more fds pointing -to the same underlying file/socket/etc. description (that is, they share -the same underlying "file open").

-

If you must do this, then force the use of a known-to-be-good backend -(at the time of this writing, this includes only EVBACKEND_SELECT and -EVBACKEND_POLL).

-

Another thing you have to watch out for is that it is quite easy to -receive "spurious" readyness notifications, that is your callback might -be called with EV_READ but a subsequent read(2) will actually block -because there is no data. Not only are some backends known to create a -lot of those (for example solaris ports), it is very easy to get into -this situation even with a relatively standard program structure. Thus -it is best to always use non-blocking I/O: An extra read(2) returning -EAGAIN is far preferable to a program hanging until some data arrives.

-

If you cannot run the fd in non-blocking mode (for example you should not -play around with an Xlib connection), then you have to seperately re-test -whether a file descriptor is really ready with a known-to-be good interface -such as poll (fortunately in our Xlib example, Xlib already does this on -its own, so its quite safe to use).

- -
-

The special problem of disappearing file descriptors

-
-

Some backends (e.g kqueue, epoll) need to be told about closing a file -descriptor (either by calling close explicitly or by any other means, -such as dup). The reason is that you register interest in some file -descriptor, but when it goes away, the operating system will silently drop -this interest. If another file descriptor with the same number then is -registered with libev, there is no efficient way to see that this is, in -fact, a different file descriptor.

-

To avoid having to explicitly tell libev about such cases, libev follows -the following policy: Each time ev_io_set is being called, libev -will assume that this is potentially a new file descriptor, otherwise -it is assumed that the file descriptor stays the same. That means that -you have to call ev_io_set (or ev_io_init) when you change the -descriptor even if the file descriptor number itself did not change.

-

This is how one would do it normally anyway, the important point is that -the libev application should not optimise around libev but should leave -optimisations to libev.

- - - - - -
-

Watcher-Specific Functions

-
-
-
ev_io_init (ev_io *, callback, int fd, int events)
-
ev_io_set (ev_io *, int fd, int events)
-
-

Configures an ev_io watcher. The fd is the file descriptor to -rceeive events for and events is either EV_READ, EV_WRITE or -EV_READ | EV_WRITE to receive the given events.

-
-
int fd [read-only]
-
-

The file descriptor being watched.

-
-
int events [read-only]
-
-

The events being watched.

-
-
-

Example: Call stdin_readable_cb when STDIN_FILENO has become, well -readable, but only once. Since it is likely line-buffered, you could -attempt to read a whole line in the callback.

-
  static void
-  stdin_readable_cb (struct ev_loop *loop, struct ev_io *w, int revents)
-  {
-     ev_io_stop (loop, w);
-    .. read from stdin here (or from w->fd) and haqndle any I/O errors
-  }
-
-  ...
-  struct ev_loop *loop = ev_default_init (0);
-  struct ev_io stdin_readable;
-  ev_io_init (&stdin_readable, stdin_readable_cb, STDIN_FILENO, EV_READ);
-  ev_io_start (loop, &stdin_readable);
-  ev_loop (loop, 0);
-
-
-
-
-
- -
-

ev_timer - relative and optionally repeating timeouts

-
-

Timer watchers are simple relative timers that generate an event after a -given time, and optionally repeating in regular intervals after that.

-

The timers are based on real time, that is, if you register an event that -times out after an hour and you reset your system clock to last years -time, it will still time out after (roughly) and hour. "Roughly" because -detecting time jumps is hard, and some inaccuracies are unavoidable (the -monotonic clock option helps a lot here).

-

The relative timeouts are calculated relative to the ev_now () -time. This is usually the right thing as this timestamp refers to the time -of the event triggering whatever timeout you are modifying/starting. If -you suspect event processing to be delayed and you need to base the timeout -on the current time, use something like this to adjust for this:

-
   ev_timer_set (&timer, after + ev_now () - ev_time (), 0.);
-
-
-

The callback is guarenteed to be invoked only when its timeout has passed, -but if multiple timers become ready during the same loop iteration then -order of execution is undefined.

- -
-

Watcher-Specific Functions and Data Members

-
-
-
ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)
-
ev_timer_set (ev_timer *, ev_tstamp after, ev_tstamp repeat)
-
-

Configure the timer to trigger after after seconds. If repeat is -0., then it will automatically be stopped. If it is positive, then the -timer will automatically be configured to trigger again repeat seconds -later, again, and again, until stopped manually.

-

The timer itself will do a best-effort at avoiding drift, that is, if you -configure a timer to trigger every 10 seconds, then it will trigger at -exactly 10 second intervals. If, however, your program cannot keep up with -the timer (because it takes longer than those 10 seconds to do stuff) the -timer will not fire more than once per event loop iteration.

-
-
ev_timer_again (loop)
-
-

This will act as if the timer timed out and restart it again if it is -repeating. The exact semantics are:

-

If the timer is pending, its pending status is cleared.

-

If the timer is started but nonrepeating, stop it (as if it timed out).

-

If the timer is repeating, either start it if necessary (with the -repeat value), or reset the running timer to the repeat value.

-

This sounds a bit complicated, but here is a useful and typical -example: Imagine you have a tcp connection and you want a so-called idle -timeout, that is, you want to be called when there have been, say, 60 -seconds of inactivity on the socket. The easiest way to do this is to -configure an ev_timer with a repeat value of 60 and then call -ev_timer_again each time you successfully read or write some data. If -you go into an idle state where you do not expect data to travel on the -socket, you can ev_timer_stop the timer, and ev_timer_again will -automatically restart it if need be.

-

That means you can ignore the after value and ev_timer_start -altogether and only ever use the repeat value and ev_timer_again:

-
   ev_timer_init (timer, callback, 0., 5.);
-   ev_timer_again (loop, timer);
-   ...
-   timer->again = 17.;
-   ev_timer_again (loop, timer);
-   ...
-   timer->again = 10.;
-   ev_timer_again (loop, timer);
-
-
-

This is more slightly efficient then stopping/starting the timer each time -you want to modify its timeout value.

-
-
ev_tstamp repeat [read-write]
-
-

The current repeat value. Will be used each time the watcher times out -or ev_timer_again is called and determines the next timeout (if any), -which is also when any modifications are taken into account.

-
-
-

Example: Create a timer that fires after 60 seconds.

-
  static void
-  one_minute_cb (struct ev_loop *loop, struct ev_timer *w, int revents)
-  {
-    .. one minute over, w is actually stopped right here
-  }
-
-  struct ev_timer mytimer;
-  ev_timer_init (&mytimer, one_minute_cb, 60., 0.);
-  ev_timer_start (loop, &mytimer);
-
-
-

Example: Create a timeout timer that times out after 10 seconds of -inactivity.

-
  static void
-  timeout_cb (struct ev_loop *loop, struct ev_timer *w, int revents)
-  {
-    .. ten seconds without any activity
-  }
-
-  struct ev_timer mytimer;
-  ev_timer_init (&mytimer, timeout_cb, 0., 10.); /* note, only repeat used */
-  ev_timer_again (&mytimer); /* start timer */
-  ev_loop (loop, 0);
-
-  // and in some piece of code that gets executed on any "activity":
-  // reset the timeout to start ticking again at 10 seconds
-  ev_timer_again (&mytimer);
-
-
-
-
-
- -
-

ev_periodic - to cron or not to cron?

-
-

Periodic watchers are also timers of a kind, but they are very versatile -(and unfortunately a bit complex).

-

Unlike ev_timer's, they are not based on real time (or relative time) -but on wallclock time (absolute time). You can tell a periodic watcher -to trigger "at" some specific point in time. For example, if you tell a -periodic watcher to trigger in 10 seconds (by specifiying e.g. ev_now () -+ 10.) and then reset your system clock to the last year, then it will -take a year to trigger the event (unlike an ev_timer, which would trigger -roughly 10 seconds later).

-

They can also be used to implement vastly more complex timers, such as -triggering an event on each midnight, local time or other, complicated, -rules.

-

As with timers, the callback is guarenteed to be invoked only when the -time (at) has been passed, but if multiple periodic timers become ready -during the same loop iteration then order of execution is undefined.

- -
-

Watcher-Specific Functions and Data Members

-
-
-
ev_periodic_init (ev_periodic *, callback, ev_tstamp at, ev_tstamp interval, reschedule_cb)
-
ev_periodic_set (ev_periodic *, ev_tstamp after, ev_tstamp repeat, reschedule_cb)
-
-

Lots of arguments, lets sort it out... There are basically three modes of -operation, and we will explain them from simplest to complex:

-

-

-
* absolute timer (at = time, interval = reschedule_cb = 0)
-
-

In this configuration the watcher triggers an event at the wallclock time -at and doesn't repeat. It will not adjust when a time jump occurs, -that is, if it is to be run at January 1st 2011 then it will run when the -system time reaches or surpasses this time.

-
-
* non-repeating interval timer (at = offset, interval > 0, reschedule_cb = 0)
-
-

In this mode the watcher will always be scheduled to time out at the next -at + N * interval time (for some integer N, which can also be negative) -and then repeat, regardless of any time jumps.

-

This can be used to create timers that do not drift with respect to system -time:

-
   ev_periodic_set (&periodic, 0., 3600., 0);
-
-
-

This doesn't mean there will always be 3600 seconds in between triggers, -but only that the the callback will be called when the system time shows a -full hour (UTC), or more correctly, when the system time is evenly divisible -by 3600.

-

Another way to think about it (for the mathematically inclined) is that -ev_periodic will try to run the callback in this mode at the next possible -time where time = at (mod interval), regardless of any time jumps.

-

For numerical stability it is preferable that the at value is near -ev_now () (the current time), but there is no range requirement for -this value.

-
-
* manual reschedule mode (at and interval ignored, reschedule_cb = callback)
-
-

In this mode the values for interval and at are both being -ignored. Instead, each time the periodic watcher gets scheduled, the -reschedule callback will be called with the watcher as first, and the -current time as second argument.

-

NOTE: This callback MUST NOT stop or destroy any periodic watcher, -ever, or make any event loop modifications. If you need to stop it, -return now + 1e30 (or so, fudge fudge) and stop it afterwards (e.g. by -starting an ev_prepare watcher, which is legal).

-

Its prototype is ev_tstamp (*reschedule_cb)(struct ev_periodic *w, -ev_tstamp now), e.g.:

-
   static ev_tstamp my_rescheduler (struct ev_periodic *w, ev_tstamp now)
-   {
-     return now + 60.;
-   }
-
-
-

It must return the next time to trigger, based on the passed time value -(that is, the lowest time value larger than to the second argument). It -will usually be called just before the callback will be triggered, but -might be called at other times, too.

-

NOTE: This callback must always return a time that is later than the -passed now value. Not even now itself will do, it must be larger.

-

This can be used to create very complex timers, such as a timer that -triggers on each midnight, local time. To do this, you would calculate the -next midnight after now and return the timestamp value for this. How -you do this is, again, up to you (but it is not trivial, which is the main -reason I omitted it as an example).

-
-
-

-
-
ev_periodic_again (loop, ev_periodic *)
-
-

Simply stops and restarts the periodic watcher again. This is only useful -when you changed some parameters or the reschedule callback would return -a different time than the last time it was called (e.g. in a crond like -program when the crontabs have changed).

-
-
ev_tstamp offset [read-write]
-
-

When repeating, this contains the offset value, otherwise this is the -absolute point in time (the at value passed to ev_periodic_set).

-

Can be modified any time, but changes only take effect when the periodic -timer fires or ev_periodic_again is being called.

-
-
ev_tstamp interval [read-write]
-
-

The current interval value. Can be modified any time, but changes only -take effect when the periodic timer fires or ev_periodic_again is being -called.

-
-
ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now) [read-write]
-
-

The current reschedule callback, or 0, if this functionality is -switched off. Can be changed any time, but changes only take effect when -the periodic timer fires or ev_periodic_again is being called.

-
-
-

Example: Call a callback every hour, or, more precisely, whenever the -system clock is divisible by 3600. The callback invocation times have -potentially a lot of jittering, but good long-term stability.

-
  static void
-  clock_cb (struct ev_loop *loop, struct ev_io *w, int revents)
-  {
-    ... its now a full hour (UTC, or TAI or whatever your clock follows)
-  }
-
-  struct ev_periodic hourly_tick;
-  ev_periodic_init (&hourly_tick, clock_cb, 0., 3600., 0);
-  ev_periodic_start (loop, &hourly_tick);
-
-
-

Example: The same as above, but use a reschedule callback to do it:

-
  #include <math.h>
-
-  static ev_tstamp
-  my_scheduler_cb (struct ev_periodic *w, ev_tstamp now)
-  {
-    return fmod (now, 3600.) + 3600.;
-  }
-
-  ev_periodic_init (&hourly_tick, clock_cb, 0., 0., my_scheduler_cb);
-
-
-

Example: Call a callback every hour, starting now:

-
  struct ev_periodic hourly_tick;
-  ev_periodic_init (&hourly_tick, clock_cb,
-                    fmod (ev_now (loop), 3600.), 3600., 0);
-  ev_periodic_start (loop, &hourly_tick);
-
-
-
-
-
- -
-

ev_signal - signal me when a signal gets signalled!

-
-

Signal watchers will trigger an event when the process receives a specific -signal one or more times. Even though signals are very asynchronous, libev -will try it's best to deliver signals synchronously, i.e. as part of the -normal event processing, like any other event.

-

You can configure as many watchers as you like per signal. Only when the -first watcher gets started will libev actually register a signal watcher -with the kernel (thus it coexists with your own signal handlers as long -as you don't register any with libev). Similarly, when the last signal -watcher for a signal is stopped libev will reset the signal handler to -SIG_DFL (regardless of what it was set to before).

- -
-

Watcher-Specific Functions and Data Members

-
-
-
ev_signal_init (ev_signal *, callback, int signum)
-
ev_signal_set (ev_signal *, int signum)
-
-

Configures the watcher to trigger on the given signal number (usually one -of the SIGxxx constants).

-
-
int signum [read-only]
-
-

The signal the watcher watches out for.

-
-
- - - - - -
-

ev_child - watch out for process status changes

-
-

Child watchers trigger when your process receives a SIGCHLD in response to -some child status changes (most typically when a child of yours dies).

- -
-

Watcher-Specific Functions and Data Members

-
-
-
ev_child_init (ev_child *, callback, int pid)
-
ev_child_set (ev_child *, int pid)
-
-

Configures the watcher to wait for status changes of process pid (or -any process if pid is specified as 0). The callback can look -at the rstatus member of the ev_child watcher structure to see -the status word (use the macros from sys/wait.h and see your systems -waitpid documentation). The rpid member contains the pid of the -process causing the status change.

-
-
int pid [read-only]
-
-

The process id this watcher watches out for, or 0, meaning any process id.

-
-
int rpid [read-write]
-
-

The process id that detected a status change.

-
-
int rstatus [read-write]
-
-

The process exit/trace status caused by rpid (see your systems -waitpid and sys/wait.h documentation for details).

-
-
-

Example: Try to exit cleanly on SIGINT and SIGTERM.

-
  static void
-  sigint_cb (struct ev_loop *loop, struct ev_signal *w, int revents)
-  {
-    ev_unloop (loop, EVUNLOOP_ALL);
-  }
-
-  struct ev_signal signal_watcher;
-  ev_signal_init (&signal_watcher, sigint_cb, SIGINT);
-  ev_signal_start (loop, &sigint_cb);
-
-
-
-
-
- -
-

ev_stat - did the file attributes just change?

-
-

This watches a filesystem path for attribute changes. That is, it calls -stat regularly (or when the OS says it changed) and sees if it changed -compared to the last time, invoking the callback if it did.

-

The path does not need to exist: changing from "path exists" to "path does -not exist" is a status change like any other. The condition "path does -not exist" is signified by the st_nlink field being zero (which is -otherwise always forced to be at least one) and all the other fields of -the stat buffer having unspecified contents.

-

The path should be absolute and must not end in a slash. If it is -relative and your working directory changes, the behaviour is undefined.

-

Since there is no standard to do this, the portable implementation simply -calls stat (2) regularly on the path to see if it changed somehow. You -can specify a recommended polling interval for this case. If you specify -a polling interval of 0 (highly recommended!) then a suitable, -unspecified default value will be used (which you can expect to be around -five seconds, although this might change dynamically). Libev will also -impose a minimum interval which is currently around 0.1, but thats -usually overkill.

-

This watcher type is not meant for massive numbers of stat watchers, -as even with OS-supported change notifications, this can be -resource-intensive.

-

At the time of this writing, only the Linux inotify interface is -implemented (implementing kqueue support is left as an exercise for the -reader). Inotify will be used to give hints only and should not change the -semantics of ev_stat watchers, which means that libev sometimes needs -to fall back to regular polling again even with inotify, but changes are -usually detected immediately, and if the file exists there will be no -polling.

- -
-

Watcher-Specific Functions and Data Members

-
-
-
ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)
-
ev_stat_set (ev_stat *, const char *path, ev_tstamp interval)
-
-

Configures the watcher to wait for status changes of the given -path. The interval is a hint on how quickly a change is expected to -be detected and should normally be specified as 0 to let libev choose -a suitable value. The memory pointed to by path must point to the same -path for as long as the watcher is active.

-

The callback will be receive EV_STAT when a change was detected, -relative to the attributes at the time the watcher was started (or the -last change was detected).

-
-
ev_stat_stat (ev_stat *)
-
-

Updates the stat buffer immediately with new values. If you change the -watched path in your callback, you could call this fucntion to avoid -detecting this change (while introducing a race condition). Can also be -useful simply to find out the new values.

-
-
ev_statdata attr [read-only]
-
-

The most-recently detected attributes of the file. Although the type is of -ev_statdata, this is usually the (or one of the) struct stat types -suitable for your system. If the st_nlink member is 0, then there -was some error while stating the file.

-
-
ev_statdata prev [read-only]
-
-

The previous attributes of the file. The callback gets invoked whenever -prev != attr.

-
-
ev_tstamp interval [read-only]
-
-

The specified interval.

-
-
const char *path [read-only]
-
-

The filesystem path that is being watched.

-
-
-

Example: Watch /etc/passwd for attribute changes.

-
  static void
-  passwd_cb (struct ev_loop *loop, ev_stat *w, int revents)
-  {
-    /* /etc/passwd changed in some way */
-    if (w->attr.st_nlink)
-      {
-        printf ("passwd current size  %ld\n", (long)w->attr.st_size);
-        printf ("passwd current atime %ld\n", (long)w->attr.st_mtime);
-        printf ("passwd current mtime %ld\n", (long)w->attr.st_mtime);
-      }
-    else
-      /* you shalt not abuse printf for puts */
-      puts ("wow, /etc/passwd is not there, expect problems. "
-            "if this is windows, they already arrived\n");
-  }
-
-  ...
-  ev_stat passwd;
-
-  ev_stat_init (&passwd, passwd_cb, "/etc/passwd");
-  ev_stat_start (loop, &passwd);
-
-
-
-
-
- -
-

ev_idle - when you've got nothing better to do...

-
-

Idle watchers trigger events when no other events of the same or higher -priority are pending (prepare, check and other idle watchers do not -count).

-

That is, as long as your process is busy handling sockets or timeouts -(or even signals, imagine) of the same or higher priority it will not be -triggered. But when your process is idle (or only lower-priority watchers -are pending), the idle watchers are being called once per event loop -iteration - until stopped, that is, or your process receives more events -and becomes busy again with higher priority stuff.

-

The most noteworthy effect is that as long as any idle watchers are -active, the process will not block when waiting for new events.

-

Apart from keeping your process non-blocking (which is a useful -effect on its own sometimes), idle watchers are a good place to do -"pseudo-background processing", or delay processing stuff to after the -event loop has handled all outstanding events.

- -
-

Watcher-Specific Functions and Data Members

-
-
-
ev_idle_init (ev_signal *, callback)
-
-

Initialises and configures the idle watcher - it has no parameters of any -kind. There is a ev_idle_set macro, but using it is utterly pointless, -believe me.

-
-
-

Example: Dynamically allocate an ev_idle watcher, start it, and in the -callback, free it. Also, use no error checking, as usual.

-
  static void
-  idle_cb (struct ev_loop *loop, struct ev_idle *w, int revents)
-  {
-    free (w);
-    // now do something you wanted to do when the program has
-    // no longer asnything immediate to do.
-  }
-
-  struct ev_idle *idle_watcher = malloc (sizeof (struct ev_idle));
-  ev_idle_init (idle_watcher, idle_cb);
-  ev_idle_start (loop, idle_cb);
-
-
-
-
-
- -
-

ev_prepare and ev_check - customise your event loop!

-
-

Prepare and check watchers are usually (but not always) used in tandem: -prepare watchers get invoked before the process blocks and check watchers -afterwards.

-

You must not call ev_loop or similar functions that enter -the current event loop from either ev_prepare or ev_check -watchers. Other loops than the current one are fine, however. The -rationale behind this is that you do not need to check for recursion in -those watchers, i.e. the sequence will always be ev_prepare, blocking, -ev_check so if you have one watcher of each kind they will always be -called in pairs bracketing the blocking call.

-

Their main purpose is to integrate other event mechanisms into libev and -their use is somewhat advanced. This could be used, for example, to track -variable changes, implement your own watchers, integrate net-snmp or a -coroutine library and lots more. They are also occasionally useful if -you cache some data and want to flush it before blocking (for example, -in X programs you might want to do an XFlush () in an ev_prepare -watcher).

-

This is done by examining in each prepare call which file descriptors need -to be watched by the other library, registering ev_io watchers for -them and starting an ev_timer watcher for any timeouts (many libraries -provide just this functionality). Then, in the check watcher you check for -any events that occured (by checking the pending status of all watchers -and stopping them) and call back into the library. The I/O and timer -callbacks will never actually be called (but must be valid nevertheless, -because you never know, you know?).

-

As another example, the Perl Coro module uses these hooks to integrate -coroutines into libev programs, by yielding to other active coroutines -during each prepare and only letting the process block if no coroutines -are ready to run (it's actually more complicated: it only runs coroutines -with priority higher than or equal to the event loop and one coroutine -of lower priority, but only once, using idle watchers to keep the event -loop from blocking if lower-priority coroutines are active, thus mapping -low-priority coroutines to idle/background tasks).

-

It is recommended to give ev_check watchers highest (EV_MAXPRI) -priority, to ensure that they are being run before any other watchers -after the poll. Also, ev_check watchers (and ev_prepare watchers, -too) should not activate ("feed") events into libev. While libev fully -supports this, they will be called before other ev_check watchers did -their job. As ev_check watchers are often used to embed other event -loops those other event loops might be in an unusable state until their -ev_check watcher ran (always remind yourself to coexist peacefully with -others).

- -
-

Watcher-Specific Functions and Data Members

-
-
-
ev_prepare_init (ev_prepare *, callback)
-
ev_check_init (ev_check *, callback)
-
-

Initialises and configures the prepare or check watcher - they have no -parameters of any kind. There are ev_prepare_set and ev_check_set -macros, but using them is utterly, utterly and completely pointless.

-
-
-

There are a number of principal ways to embed other event loops or modules -into libev. Here are some ideas on how to include libadns into libev -(there is a Perl module named EV::ADNS that does this, which you could -use for an actually working example. Another Perl module named EV::Glib -embeds a Glib main context into libev, and finally, Glib::EV embeds EV -into the Glib event loop).

-

Method 1: Add IO watchers and a timeout watcher in a prepare handler, -and in a check watcher, destroy them and call into libadns. What follows -is pseudo-code only of course. This requires you to either use a low -priority for the check watcher or use ev_clear_pending explicitly, as -the callbacks for the IO/timeout watchers might not have been called yet.

-
  static ev_io iow [nfd];
-  static ev_timer tw;
-
-  static void
-  io_cb (ev_loop *loop, ev_io *w, int revents)
-  {
-  }
-
-  // create io watchers for each fd and a timer before blocking
-  static void
-  adns_prepare_cb (ev_loop *loop, ev_prepare *w, int revents)
-  {
-    int timeout = 3600000;
-    struct pollfd fds [nfd];
-    // actual code will need to loop here and realloc etc.
-    adns_beforepoll (ads, fds, &nfd, &timeout, timeval_from (ev_time ()));
-
-    /* the callback is illegal, but won't be called as we stop during check */
-    ev_timer_init (&tw, 0, timeout * 1e-3);
-    ev_timer_start (loop, &tw);
-
-    // create one ev_io per pollfd
-    for (int i = 0; i < nfd; ++i)
-      {
-        ev_io_init (iow + i, io_cb, fds [i].fd,
-          ((fds [i].events & POLLIN ? EV_READ : 0)
-           | (fds [i].events & POLLOUT ? EV_WRITE : 0)));
-
-        fds [i].revents = 0;
-        ev_io_start (loop, iow + i);
-      }
-  }
-
-  // stop all watchers after blocking
-  static void
-  adns_check_cb (ev_loop *loop, ev_check *w, int revents)
-  {
-    ev_timer_stop (loop, &tw);
-
-    for (int i = 0; i < nfd; ++i)
-      {
-        // set the relevant poll flags
-        // could also call adns_processreadable etc. here
-        struct pollfd *fd = fds + i;
-        int revents = ev_clear_pending (iow + i);
-        if (revents & EV_READ ) fd->revents |= fd->events & POLLIN;
-        if (revents & EV_WRITE) fd->revents |= fd->events & POLLOUT;
-
-        // now stop the watcher
-        ev_io_stop (loop, iow + i);
-      }
-
-    adns_afterpoll (adns, fds, nfd, timeval_from (ev_now (loop));
-  }
-
-
-

Method 2: This would be just like method 1, but you run adns_afterpoll -in the prepare watcher and would dispose of the check watcher.

-

Method 3: If the module to be embedded supports explicit event -notification (adns does), you can also make use of the actual watcher -callbacks, and only destroy/create the watchers in the prepare watcher.

-
  static void
-  timer_cb (EV_P_ ev_timer *w, int revents)
-  {
-    adns_state ads = (adns_state)w->data;
-    update_now (EV_A);
-
-    adns_processtimeouts (ads, &tv_now);
-  }
-
-  static void
-  io_cb (EV_P_ ev_io *w, int revents)
-  {
-    adns_state ads = (adns_state)w->data;
-    update_now (EV_A);
-
-    if (revents & EV_READ ) adns_processreadable  (ads, w->fd, &tv_now);
-    if (revents & EV_WRITE) adns_processwriteable (ads, w->fd, &tv_now);
-  }
-
-  // do not ever call adns_afterpoll
-
-
-

Method 4: Do not use a prepare or check watcher because the module you -want to embed is too inflexible to support it. Instead, youc na override -their poll function. The drawback with this solution is that the main -loop is now no longer controllable by EV. The Glib::EV module does -this.

-
  static gint
-  event_poll_func (GPollFD *fds, guint nfds, gint timeout)
-  {
-    int got_events = 0;
-
-    for (n = 0; n < nfds; ++n)
-      // create/start io watcher that sets the relevant bits in fds[n] and increment got_events
-
-    if (timeout >= 0)
-      // create/start timer
-
-    // poll
-    ev_loop (EV_A_ 0);
-
-    // stop timer again
-    if (timeout >= 0)
-      ev_timer_stop (EV_A_ &to);
-
-    // stop io watchers again - their callbacks should have set
-    for (n = 0; n < nfds; ++n)
-      ev_io_stop (EV_A_ iow [n]);
-
-    return got_events;
-  }
-
-
-
-
-
- -
-

ev_embed - when one backend isn't enough...

-
-

This is a rather advanced watcher type that lets you embed one event loop -into another (currently only ev_io events are supported in the embedded -loop, other types of watchers might be handled in a delayed or incorrect -fashion and must not be used).

-

There are primarily two reasons you would want that: work around bugs and -prioritise I/O.

-

As an example for a bug workaround, the kqueue backend might only support -sockets on some platform, so it is unusable as generic backend, but you -still want to make use of it because you have many sockets and it scales -so nicely. In this case, you would create a kqueue-based loop and embed it -into your default loop (which might use e.g. poll). Overall operation will -be a bit slower because first libev has to poll and then call kevent, but -at least you can use both at what they are best.

-

As for prioritising I/O: rarely you have the case where some fds have -to be watched and handled very quickly (with low latency), and even -priorities and idle watchers might have too much overhead. In this case -you would put all the high priority stuff in one loop and all the rest in -a second one, and embed the second one in the first.

-

As long as the watcher is active, the callback will be invoked every time -there might be events pending in the embedded loop. The callback must then -call ev_embed_sweep (mainloop, watcher) to make a single sweep and invoke -their callbacks (you could also start an idle watcher to give the embedded -loop strictly lower priority for example). You can also set the callback -to 0, in which case the embed watcher will automatically execute the -embedded loop sweep.

-

As long as the watcher is started it will automatically handle events. The -callback will be invoked whenever some events have been handled. You can -set the callback to 0 to avoid having to specify one if you are not -interested in that.

-

Also, there have not currently been made special provisions for forking: -when you fork, you not only have to call ev_loop_fork on both loops, -but you will also have to stop and restart any ev_embed watchers -yourself.

-

Unfortunately, not all backends are embeddable, only the ones returned by -ev_embeddable_backends are, which, unfortunately, does not include any -portable one.

-

So when you want to use this feature you will always have to be prepared -that you cannot get an embeddable loop. The recommended way to get around -this is to have a separate variables for your embeddable loop, try to -create it, and if that fails, use the normal loop for everything:

-
  struct ev_loop *loop_hi = ev_default_init (0);
-  struct ev_loop *loop_lo = 0;
-  struct ev_embed embed;
-
-  // see if there is a chance of getting one that works
-  // (remember that a flags value of 0 means autodetection)
-  loop_lo = ev_embeddable_backends () & ev_recommended_backends ()
-    ? ev_loop_new (ev_embeddable_backends () & ev_recommended_backends ())
-    : 0;
-
-  // if we got one, then embed it, otherwise default to loop_hi
-  if (loop_lo)
-    {
-      ev_embed_init (&embed, 0, loop_lo);
-      ev_embed_start (loop_hi, &embed);
-    }
-  else
-    loop_lo = loop_hi;
-
-
- -
-

Watcher-Specific Functions and Data Members

-
-
-
ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)
-
ev_embed_set (ev_embed *, callback, struct ev_loop *embedded_loop)
-
-

Configures the watcher to embed the given loop, which must be -embeddable. If the callback is 0, then ev_embed_sweep will be -invoked automatically, otherwise it is the responsibility of the callback -to invoke it (it will continue to be called until the sweep has been done, -if you do not want thta, you need to temporarily stop the embed watcher).

-
-
ev_embed_sweep (loop, ev_embed *)
-
-

Make a single, non-blocking sweep over the embedded loop. This works -similarly to ev_loop (embedded_loop, EVLOOP_NONBLOCK), but in the most -apropriate way for embedded loops.

-
-
struct ev_loop *loop [read-only]
-
-

The embedded event loop.

-
-
- - - - - -
-

ev_fork - the audacity to resume the event loop after a fork

-
-

Fork watchers are called when a fork () was detected (usually because -whoever is a good citizen cared to tell libev about it by calling -ev_default_fork or ev_loop_fork). The invocation is done before the -event loop blocks next and before ev_check watchers are being called, -and only in the child after the fork. If whoever good citizen calling -ev_default_fork cheats and calls it in the wrong process, the fork -handlers will be invoked, too, of course.

- -
-

Watcher-Specific Functions and Data Members

-
-
-
ev_fork_init (ev_signal *, callback)
-
-

Initialises and configures the fork watcher - it has no parameters of any -kind. There is a ev_fork_set macro, but using it is utterly pointless, -believe me.

-
-
- - - - - -
-

OTHER FUNCTIONS

-
-

There are some other functions of possible interest. Described. Here. Now.

-
-
ev_once (loop, int fd, int events, ev_tstamp timeout, callback)
-
-

This function combines a simple timer and an I/O watcher, calls your -callback on whichever event happens first and automatically stop both -watchers. This is useful if you want to wait for a single event on an fd -or timeout without having to allocate/configure/start/stop/free one or -more watchers yourself.

-

If fd is less than 0, then no I/O watcher will be started and events -is being ignored. Otherwise, an ev_io watcher for the given fd and -events set will be craeted and started.

-

If timeout is less than 0, then no timeout watcher will be -started. Otherwise an ev_timer watcher with after = timeout (and -repeat = 0) will be started. While 0 is a valid timeout, it is of -dubious value.

-

The callback has the type void (*cb)(int revents, void *arg) and gets -passed an revents set like normal event callbacks (a combination of -EV_ERROR, EV_READ, EV_WRITE or EV_TIMEOUT) and the arg -value passed to ev_once:

-
  static void stdin_ready (int revents, void *arg)
-  {
-    if (revents & EV_TIMEOUT)
-      /* doh, nothing entered */;
-    else if (revents & EV_READ)
-      /* stdin might have data for us, joy! */;
-  }
-
-  ev_once (STDIN_FILENO, EV_READ, 10., stdin_ready, 0);
-
-
-
-
ev_feed_event (ev_loop *, watcher *, int revents)
-
-

Feeds the given event set into the event loop, as if the specified event -had happened for the specified watcher (which must be a pointer to an -initialised but not necessarily started event watcher).

-
-
ev_feed_fd_event (ev_loop *, int fd, int revents)
-
-

Feed an event on the given fd, as if a file descriptor backend detected -the given events it.

-
-
ev_feed_signal_event (ev_loop *loop, int signum)
-
-

Feed an event as if the given signal occured (loop must be the default -loop!).

-
-
- - - - - -
-

LIBEVENT EMULATION

-
-

Libev offers a compatibility emulation layer for libevent. It cannot -emulate the internals of libevent, so here are some usage hints:

-
-
* Use it by including <event.h>, as usual.
-
* The following members are fully supported: ev_base, ev_callback, -ev_arg, ev_fd, ev_res, ev_events.
-
* Avoid using ev_flags and the EVLIST_*-macros, while it is -maintained by libev, it does not work exactly the same way as in libevent (consider -it a private API).
-
* Priorities are not currently supported. Initialising priorities -will fail and all watchers will have the same priority, even though there -is an ev_pri field.
-
* Other members are not supported.
-
* The libev emulation is not ABI compatible to libevent, you need -to use the libev header file and library.
-
- -
-

C++ SUPPORT

-
-

Libev comes with some simplistic wrapper classes for C++ that mainly allow -you to use some convinience methods to start/stop watchers and also change -the callback model to a model using method callbacks on objects.

-

To use it,

-
  #include <ev++.h>
-
-
-

This automatically includes ev.h and puts all of its definitions (many -of them macros) into the global namespace. All C++ specific things are -put into the ev namespace. It should support all the same embedding -options as ev.h, most notably EV_MULTIPLICITY.

-

Care has been taken to keep the overhead low. The only data member the C++ -classes add (compared to plain C-style watchers) is the event loop pointer -that the watcher is associated with (or no additional members at all if -you disable EV_MULTIPLICITY when embedding libev).

-

Currently, functions, and static and non-static member functions can be -used as callbacks. Other types should be easy to add as long as they only -need one additional pointer for context. If you need support for other -types of functors please contact the author (preferably after implementing -it).

-

Here is a list of things available in the ev namespace:

-
-
ev::READ, ev::WRITE etc.
-
-

These are just enum values with the same values as the EV_READ etc. -macros from ev.h.

-
-
ev::tstamp, ev::now
-
-

Aliases to the same types/functions as with the ev_ prefix.

-
-
ev::io, ev::timer, ev::periodic, ev::idle, ev::sig etc.
-
-

For each ev_TYPE watcher in ev.h there is a corresponding class of -the same name in the ev namespace, with the exception of ev_signal -which is called ev::sig to avoid clashes with the signal macro -defines by many implementations.

-

All of those classes have these methods:

-

-

-
ev::TYPE::TYPE ()
-
ev::TYPE::TYPE (struct ev_loop *)
-
ev::TYPE::~TYPE
-
-

The constructor (optionally) takes an event loop to associate the watcher -with. If it is omitted, it will use EV_DEFAULT.

-

The constructor calls ev_init for you, which means you have to call the -set method before starting it.

-

It will not set a callback, however: You have to call the templated set -method to set a callback before you can start the watcher.

-

(The reason why you have to use a method is a limitation in C++ which does -not allow explicit template arguments for constructors).

-

The destructor automatically stops the watcher if it is active.

-
-
w->set<class, &class::method> (object *)
-
-

This method sets the callback method to call. The method has to have a -signature of void (*)(ev_TYPE &, int), it receives the watcher as -first argument and the revents as second. The object must be given as -parameter and is stored in the data member of the watcher.

-

This method synthesizes efficient thunking code to call your method from -the C callback that libev requires. If your compiler can inline your -callback (i.e. it is visible to it at the place of the set call and -your compiler is good :), then the method will be fully inlined into the -thunking function, making it as fast as a direct C callback.

-

Example: simple class declaration and watcher initialisation

-
  struct myclass
-  {
-    void io_cb (ev::io &w, int revents) { }
-  }
-
-  myclass obj;
-  ev::io iow;
-  iow.set <myclass, &myclass::io_cb> (&obj);
-
-
-
-
w->set<function> (void *data = 0)
-
-

Also sets a callback, but uses a static method or plain function as -callback. The optional data argument will be stored in the watcher's -data member and is free for you to use.

-

The prototype of the function must be void (*)(ev::TYPE &w, int).

-

See the method-set above for more details.

-

Example:

-
  static void io_cb (ev::io &w, int revents) { }
-  iow.set <io_cb> ();
-
-
-
-
w->set (struct ev_loop *)
-
-

Associates a different struct ev_loop with this watcher. You can only -do this when the watcher is inactive (and not pending either).

-
-
w->set ([args])
-
-

Basically the same as ev_TYPE_set, with the same args. Must be -called at least once. Unlike the C counterpart, an active watcher gets -automatically stopped and restarted when reconfiguring it with this -method.

-
-
w->start ()
-
-

Starts the watcher. Note that there is no loop argument, as the -constructor already stores the event loop.

-
-
w->stop ()
-
-

Stops the watcher if it is active. Again, no loop argument.

-
-
w->again () ev::timer, ev::periodic only
-
-

For ev::timer and ev::periodic, this invokes the corresponding -ev_TYPE_again function.

-
-
w->sweep () ev::embed only
-
-

Invokes ev_embed_sweep.

-
-
w->update () ev::stat only
-
-

Invokes ev_stat_stat.

-
-
-

-
-
-

Example: Define a class with an IO and idle watcher, start one of them in -the constructor.

-
  class myclass
-  {
-    ev_io   io;   void io_cb   (ev::io   &w, int revents);
-    ev_idle idle  void idle_cb (ev::idle &w, int revents);
-
-    myclass ();
-  }
-
-  myclass::myclass (int fd)
-  {
-    io  .set <myclass, &myclass::io_cb  > (this);
-    idle.set <myclass, &myclass::idle_cb> (this);
-
-    io.start (fd, ev::READ);
-  }
-
-
-
-
-
- -
-

MACRO MAGIC

-
-

Libev can be compiled with a variety of options, the most fundemantal is -EV_MULTIPLICITY. This option determines whether (most) functions and -callbacks have an initial struct ev_loop * argument.

-

To make it easier to write programs that cope with either variant, the -following macros are defined:

-
-
EV_A, EV_A_
-
-

This provides the loop argument for functions, if one is required ("ev -loop argument"). The EV_A form is used when this is the sole argument, -EV_A_ is used when other arguments are following. Example:

-
  ev_unref (EV_A);
-  ev_timer_add (EV_A_ watcher);
-  ev_loop (EV_A_ 0);
-
-
-

It assumes the variable loop of type struct ev_loop * is in scope, -which is often provided by the following macro.

-
-
EV_P, EV_P_
-
-

This provides the loop parameter for functions, if one is required ("ev -loop parameter"). The EV_P form is used when this is the sole parameter, -EV_P_ is used when other parameters are following. Example:

-
  // this is how ev_unref is being declared
-  static void ev_unref (EV_P);
-
-  // this is how you can declare your typical callback
-  static void cb (EV_P_ ev_timer *w, int revents)
-
-
-

It declares a parameter loop of type struct ev_loop *, quite -suitable for use with EV_A.

-
-
EV_DEFAULT, EV_DEFAULT_
-
-

Similar to the other two macros, this gives you the value of the default -loop, if multiple loops are supported ("ev loop default").

-
-
-

Example: Declare and initialise a check watcher, utilising the above -macros so it will work regardless of whether multiple loops are supported -or not.

-
  static void
-  check_cb (EV_P_ ev_timer *w, int revents)
-  {
-    ev_check_stop (EV_A_ w);
-  }
-
-  ev_check check;
-  ev_check_init (&check, check_cb);
-  ev_check_start (EV_DEFAULT_ &check);
-  ev_loop (EV_DEFAULT_ 0);
-
-
- -
-

EMBEDDING

-
-

Libev can (and often is) directly embedded into host -applications. Examples of applications that embed it include the Deliantra -Game Server, the EV perl module, the GNU Virtual Private Ethernet (gvpe) -and rxvt-unicode.

-

The goal is to enable you to just copy the neecssary files into your -source directory without having to change even a single line in them, so -you can easily upgrade by simply copying (or having a checked-out copy of -libev somewhere in your source tree).

- -
-

FILESETS

-
-

Depending on what features you need you need to include one or more sets of files -in your app.

- -
-

CORE EVENT LOOP

-
-

To include only the libev core (all the ev_* functions), with manual -configuration (no autoconf):

-
  #define EV_STANDALONE 1
-  #include "ev.c"
-
-
-

This will automatically include ev.h, too, and should be done in a -single C source file only to provide the function implementations. To use -it, do the same for ev.h in all files wishing to use this API (best -done by writing a wrapper around ev.h that you can include instead and -where you can put other configuration options):

-
  #define EV_STANDALONE 1
-  #include "ev.h"
-
-
-

Both header files and implementation files can be compiled with a C++ -compiler (at least, thats a stated goal, and breakage will be treated -as a bug).

-

You need the following files in your source tree, or in a directory -in your include path (e.g. in libev/ when using -Ilibev):

-
  ev.h
-  ev.c
-  ev_vars.h
-  ev_wrap.h
-
-  ev_win32.c      required on win32 platforms only
-
-  ev_select.c     only when select backend is enabled (which is enabled by default)
-  ev_poll.c       only when poll backend is enabled (disabled by default)
-  ev_epoll.c      only when the epoll backend is enabled (disabled by default)
-  ev_kqueue.c     only when the kqueue backend is enabled (disabled by default)
-  ev_port.c       only when the solaris port backend is enabled (disabled by default)
-
-
-

ev.c includes the backend files directly when enabled, so you only need -to compile this single file.

- -
-

LIBEVENT COMPATIBILITY API

-
-

To include the libevent compatibility API, also include:

-
  #include "event.c"
-
-
-

in the file including ev.c, and:

-
  #include "event.h"
-
-
-

in the files that want to use the libevent API. This also includes ev.h.

-

You need the following additional files for this:

-
  event.h
-  event.c
-
-
- -
-

AUTOCONF SUPPORT

-
-

Instead of using EV_STANDALONE=1 and providing your config in -whatever way you want, you can also m4_include([libev.m4]) in your -configure.ac and leave EV_STANDALONE undefined. ev.c will then -include config.h and configure itself accordingly.

-

For this of course you need the m4 file:

-
  libev.m4
-
-
- -
-

PREPROCESSOR SYMBOLS/MACROS

-
-

Libev can be configured via a variety of preprocessor symbols you have to define -before including any of its files. The default is not to build for multiplicity -and only include the select backend.

-
-
EV_STANDALONE
-
-

Must always be 1 if you do not use autoconf configuration, which -keeps libev from including config.h, and it also defines dummy -implementations for some libevent functions (such as logging, which is not -supported). It will also not define any of the structs usually found in -event.h that are not directly supported by the libev core alone.

-
-
EV_USE_MONOTONIC
-
-

If defined to be 1, libev will try to detect the availability of the -monotonic clock option at both compiletime and runtime. Otherwise no use -of the monotonic clock option will be attempted. If you enable this, you -usually have to link against librt or something similar. Enabling it when -the functionality isn't available is safe, though, althoguh you have -to make sure you link against any libraries where the clock_gettime -function is hiding in (often -lrt).

-
-
EV_USE_REALTIME
-
-

If defined to be 1, libev will try to detect the availability of the -realtime clock option at compiletime (and assume its availability at -runtime if successful). Otherwise no use of the realtime clock option will -be attempted. This effectively replaces gettimeofday by clock_get -(CLOCK_REALTIME, ...) and will not normally affect correctness. See tzhe note about libraries -in the description of EV_USE_MONOTONIC, though.

-
-
EV_USE_SELECT
-
-

If undefined or defined to be 1, libev will compile in support for the -select(2) backend. No attempt at autodetection will be done: if no -other method takes over, select will be it. Otherwise the select backend -will not be compiled in.

-
-
EV_SELECT_USE_FD_SET
-
-

If defined to 1, then the select backend will use the system fd_set -structure. This is useful if libev doesn't compile due to a missing -NFDBITS or fd_mask definition or it misguesses the bitset layout on -exotic systems. This usually limits the range of file descriptors to some -low limit such as 1024 or might have other limitations (winsocket only -allows 64 sockets). The FD_SETSIZE macro, set before compilation, might -influence the size of the fd_set used.

-
-
EV_SELECT_IS_WINSOCKET
-
-

When defined to 1, the select backend will assume that -select/socket/connect etc. don't understand file descriptors but -wants osf handles on win32 (this is the case when the select to -be used is the winsock select). This means that it will call -_get_osfhandle on the fd to convert it to an OS handle. Otherwise, -it is assumed that all these functions actually work on fds, even -on win32. Should not be defined on non-win32 platforms.

-
-
EV_USE_POLL
-
-

If defined to be 1, libev will compile in support for the poll(2) -backend. Otherwise it will be enabled on non-win32 platforms. It -takes precedence over select.

-
-
EV_USE_EPOLL
-
-

If defined to be 1, libev will compile in support for the Linux -epoll(7) backend. Its availability will be detected at runtime, -otherwise another method will be used as fallback. This is the -preferred backend for GNU/Linux systems.

-
-
EV_USE_KQUEUE
-
-

If defined to be 1, libev will compile in support for the BSD style -kqueue(2) backend. Its actual availability will be detected at runtime, -otherwise another method will be used as fallback. This is the preferred -backend for BSD and BSD-like systems, although on most BSDs kqueue only -supports some types of fds correctly (the only platform we found that -supports ptys for example was NetBSD), so kqueue might be compiled in, but -not be used unless explicitly requested. The best way to use it is to find -out whether kqueue supports your type of fd properly and use an embedded -kqueue loop.

-
-
EV_USE_PORT
-
-

If defined to be 1, libev will compile in support for the Solaris -10 port style backend. Its availability will be detected at runtime, -otherwise another method will be used as fallback. This is the preferred -backend for Solaris 10 systems.

-
-
EV_USE_DEVPOLL
-
-

reserved for future expansion, works like the USE symbols above.

-
-
EV_USE_INOTIFY
-
-

If defined to be 1, libev will compile in support for the Linux inotify -interface to speed up ev_stat watchers. Its actual availability will -be detected at runtime.

-
-
EV_H
-
-

The name of the ev.h header file used to include it. The default if -undefined is <ev.h> in event.h and "ev.h" in ev.c. This -can be used to virtually rename the ev.h header file in case of conflicts.

-
-
EV_CONFIG_H
-
-

If EV_STANDALONE isn't 1, this variable can be used to override -ev.c's idea of where to find the config.h file, similarly to -EV_H, above.

-
-
EV_EVENT_H
-
-

Similarly to EV_H, this macro can be used to override event.c's idea -of how the event.h header can be found.

-
-
EV_PROTOTYPES
-
-

If defined to be 0, then ev.h will not define any function -prototypes, but still define all the structs and other symbols. This is -occasionally useful if you want to provide your own wrapper functions -around libev functions.

-
-
EV_MULTIPLICITY
-
-

If undefined or defined to 1, then all event-loop-specific functions -will have the struct ev_loop * as first argument, and you can create -additional independent event loops. Otherwise there will be no support -for multiple event loops and there is no first event loop pointer -argument. Instead, all functions act on the single default loop.

-
-
EV_MINPRI
-
EV_MAXPRI
-
-

The range of allowed priorities. EV_MINPRI must be smaller or equal to -EV_MAXPRI, but otherwise there are no non-obvious limitations. You can -provide for more priorities by overriding those symbols (usually defined -to be -2 and 2, respectively).

-

When doing priority-based operations, libev usually has to linearly search -all the priorities, so having many of them (hundreds) uses a lot of space -and time, so using the defaults of five priorities (-2 .. +2) is usually -fine.

-

If your embedding app does not need any priorities, defining these both to -0 will save some memory and cpu.

-
-
EV_PERIODIC_ENABLE
-
-

If undefined or defined to be 1, then periodic timers are supported. If -defined to be 0, then they are not. Disabling them saves a few kB of -code.

-
-
EV_IDLE_ENABLE
-
-

If undefined or defined to be 1, then idle watchers are supported. If -defined to be 0, then they are not. Disabling them saves a few kB of -code.

-
-
EV_EMBED_ENABLE
-
-

If undefined or defined to be 1, then embed watchers are supported. If -defined to be 0, then they are not.

-
-
EV_STAT_ENABLE
-
-

If undefined or defined to be 1, then stat watchers are supported. If -defined to be 0, then they are not.

-
-
EV_FORK_ENABLE
-
-

If undefined or defined to be 1, then fork watchers are supported. If -defined to be 0, then they are not.

-
-
EV_MINIMAL
-
-

If you need to shave off some kilobytes of code at the expense of some -speed, define this symbol to 1. Currently only used for gcc to override -some inlining decisions, saves roughly 30% codesize of amd64.

-
-
EV_PID_HASHSIZE
-
-

ev_child watchers use a small hash table to distribute workload by -pid. The default size is 16 (or 1 with EV_MINIMAL), usually more -than enough. If you need to manage thousands of children you might want to -increase this value (must be a power of two).

-
-
EV_INOTIFY_HASHSIZE
-
-

ev_staz watchers use a small hash table to distribute workload by -inotify watch id. The default size is 16 (or 1 with EV_MINIMAL), -usually more than enough. If you need to manage thousands of ev_stat -watchers you might want to increase this value (must be a power of -two).

-
-
EV_COMMON
-
-

By default, all watchers have a void *data member. By redefining -this macro to a something else you can include more and other types of -members. You have to define it each time you include one of the files, -though, and it must be identical each time.

-

For example, the perl EV module uses something like this:

-
  #define EV_COMMON                       \
-    SV *self; /* contains this struct */  \
-    SV *cb_sv, *fh /* note no trailing ";" */
-
-
-
-
EV_CB_DECLARE (type)
-
EV_CB_INVOKE (watcher, revents)
-
ev_set_cb (ev, cb)
-
-

Can be used to change the callback member declaration in each watcher, -and the way callbacks are invoked and set. Must expand to a struct member -definition and a statement, respectively. See the ev.v header file for -their default definitions. One possible use for overriding these is to -avoid the struct ev_loop * as first argument in all cases, or to use -method calls instead of plain function calls in C++.

- -
-

EXAMPLES

-
-

For a real-world example of a program the includes libev -verbatim, you can have a look at the EV perl module -(http://software.schmorp.de/pkg/EV.html). It has the libev files in -the libev/ subdirectory and includes them in the EV/EVAPI.h (public -interface) and EV.xs (implementation) files. Only the EV.xs file -will be compiled. It is pretty complex because it provides its own header -file.

-

The usage in rxvt-unicode is simpler. It has a ev_cpp.h header file -that everybody includes and which overrides some configure choices:

-
  #define EV_MINIMAL 1
-  #define EV_USE_POLL 0
-  #define EV_MULTIPLICITY 0
-  #define EV_PERIODIC_ENABLE 0
-  #define EV_STAT_ENABLE 0
-  #define EV_FORK_ENABLE 0
-  #define EV_CONFIG_H <config.h>
-  #define EV_MINPRI 0
-  #define EV_MAXPRI 0
-
-  #include "ev++.h"
-
-
-

And a ev_cpp.C implementation file that contains libev proper and is compiled:

-
  #include "ev_cpp.h"
-  #include "ev.c"
-
-
-
-
-
- -
-

COMPLEXITIES

-
-

In this section the complexities of (many of) the algorithms used inside -libev will be explained. For complexity discussions about backends see the -documentation for ev_default_init.

-

All of the following are about amortised time: If an array needs to be -extended, libev needs to realloc and move the whole array, but this -happens asymptotically never with higher number of elements, so O(1) might -mean it might do a lengthy realloc operation in rare cases, but on average -it is much faster and asymptotically approaches constant time.

-

-

-
Starting and stopping timer/periodic watchers: O(log skipped_other_timers)
-
-

This means that, when you have a watcher that triggers in one hour and -there are 100 watchers that would trigger before that then inserting will -have to skip those 100 watchers.

-
-
Changing timer/periodic watchers (by autorepeat, again): O(log skipped_other_timers)
-
-

That means that for changing a timer costs less than removing/adding them -as only the relative motion in the event queue has to be paid for.

-
-
Starting io/check/prepare/idle/signal/child watchers: O(1)
-
-

These just add the watcher into an array or at the head of a list. -=item Stopping check/prepare/idle watchers: O(1)

-
-
Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % EV_PID_HASHSIZE))
-
-

These watchers are stored in lists then need to be walked to find the -correct watcher to remove. The lists are usually short (you don't usually -have many watchers waiting for the same fd or signal).

-
-
Finding the next timer per loop iteration: O(1)
-
Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)
-
-

A change means an I/O watcher gets started or stopped, which requires -libev to recalculate its status (and possibly tell the kernel).

-
-
Activating one watcher: O(1)
-
Priority handling: O(number_of_priorities)
-
-

Priorities are implemented by allocating some space for each -priority. When doing priority-based operations, libev usually has to -linearly search all the priorities.

-
-
-

- - - - - -
-

AUTHOR

-
-

Marc Lehmann <libev@schmorp.de>.

- -
-
- diff --git a/ev.pod b/ev.pod index ef49626..905e935 100644 --- a/ev.pod +++ b/ev.pod @@ -2021,16 +2021,16 @@ constructor already stores the event loop. Stops the watcher if it is active. Again, no C argument. -=item w->again () C, C only +=item w->again () (C, C only) For C and C, this invokes the corresponding C function. -=item w->sweep () C only +=item w->sweep () (C only) Invokes C. -=item w->update () C only +=item w->update () (C only) Invokes C. @@ -2060,9 +2060,9 @@ the constructor. =head1 MACRO MAGIC -Libev can be compiled with a variety of options, the most fundemantal is -C. This option determines whether (most) functions and -callbacks have an initial C argument. +Libev can be compiled with a variety of options, the most fundamantal +of which is C. This option determines whether (most) +functions and callbacks have an initial C argument. To make it easier to write programs that cope with either variant, the following macros are defined: diff --git a/import_libevent b/import_libevent index 024448b..e13ec92 100755 --- a/import_libevent +++ b/import_libevent @@ -91,7 +91,7 @@ perl -ne ' s/\bevent-internal.h\b//g; s/\bevsignal.h\b//g; s/^(man_MANS\s*=)/$1 ev.3 /; - s/^(EXTRA_DIST\s*=)/$1 libev.m4 ev.h ev_vars.h ev_wrap.h event_compat.h ev++.h ev_epoll.c ev_select.c ev_poll.c ev_kqueue.c ev_port.c ev_win32.c ev.3 ev.pod ev.html /; + s/^(EXTRA_DIST\s*=)/$1 libev.m4 ev.h ev_vars.h ev_wrap.h event_compat.h ev++.h ev_epoll.c ev_select.c ev_poll.c ev_kqueue.c ev_port.c ev_win32.c ev.3 ev.pod /; s/^(include_HEADERS\s*=)/$1 ev.h event_compat.h ev++.h /; s/^(CORE_SRC\s*=)/$1 ev.c /; s/^(SYS_LIBS\s*=)/$1 -lm /; -- cgit v1.2.3