<meta name="description" content="Pod documentation for libev" />
<meta name="inputfile" content="<standard input>" />
<meta name="outputfile" content="<standard output>" />
- <meta name="created" content="Tue Nov 27 21:38:05 2007" />
+ <meta name="created" content="Thu Nov 29 21:05:58 2007" />
<meta name="generator" content="Pod::Xhtml 1.57" />
<link rel="stylesheet" href="http://res.tst.eu/pod.css"/></head>
<body>
</div>
<h1 id="FEATURES">FEATURES</h1>
<div id="FEATURES_CONTENT">
-<p>Libev supports <code>select</code>, <code>poll</code>, the linux-specific <code>epoll</code>, the
-bsd-specific <code>kqueue</code> and the solaris-specific event port mechanisms
-for file descriptor events (<code>ev_io</code>), relative timers (<code>ev_timer</code>),
-absolute timers with customised rescheduling (<code>ev_periodic</code>), synchronous
-signals (<code>ev_signal</code>), process status change events (<code>ev_child</code>), and
-event watchers dealing with the event loop mechanism itself (<code>ev_idle</code>,
+<p>Libev supports <code>select</code>, <code>poll</code>, the Linux-specific <code>epoll</code>, the
+BSD-specific <code>kqueue</code> and the Solaris-specific event port mechanisms
+for file descriptor events (<code>ev_io</code>), the Linux <code>inotify</code> interface
+(for <code>ev_stat</code>), relative timers (<code>ev_timer</code>), absolute timers
+with customised rescheduling (<code>ev_periodic</code>), synchronous signals
+(<code>ev_signal</code>), process status change events (<code>ev_child</code>), and event
+watchers dealing with the event loop mechanism itself (<code>ev_idle</code>,
<code>ev_embed</code>, <code>ev_prepare</code> and <code>ev_check</code> watchers) as well as
file watchers (<code>ev_stat</code>) and even limited support for fork events
(<code>ev_fork</code>).</p>
recommended ones.</p>
<p>See the description of <code>ev_embed</code> watchers for more info.</p>
</dd>
- <dt>ev_set_allocator (void *(*cb)(void *ptr, size_t size))</dt>
+ <dt>ev_set_allocator (void *(*cb)(void *ptr, long size))</dt>
<dd>
- <p>Sets the allocation function to use (the prototype and semantics are
-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.</p>
+ <p>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.</p>
<p>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.</p>
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.</p>
+ </dd>
+ <dt><code>EVFLAG_FORKCHECK</code></dt>
+ <dd>
+ <p>Instead of calling <code>ev_default_fork</code> or <code>ev_loop_fork</code> manually after
+a fork, you can also make libev check for a fork in each iteration by
+enabling this flag.</p>
+ <p>This works by calling <code>getpid ()</code> 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 noticable (on my
+Linux system for example, <code>getpid</code> is actually a simple 5-insn sequence
+without a syscall and thus <i>very</i> fast, but my Linux system also has
+<code>pthread_atfork</code> which is even faster).</p>
+ <p>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.</p>
+ <p>This flag setting cannot be overriden or specified in the <code>LIBEV_FLAGS</code>
+environment variable.</p>
</dd>
<dt><code>EVBACKEND_SELECT</code> (value 1, portable select backend)</dt>
<dd>
<dd>
<p>This will act as if the timer timed out and restart it again if it is
repeating. The exact semantics are:</p>
- <p>If the timer is started but nonrepeating, stop it.</p>
- <p>If the timer is repeating, either start it if necessary (with the repeat
-value), or reset the running timer to the repeat value.</p>
+ <p>If the timer is pending, its pending status is cleared.</p>
+ <p>If the timer is started but nonrepeating, stop it (as if it timed out).</p>
+ <p>If the timer is repeating, either start it if necessary (with the
+<code>repeat</code> value), or reset the running timer to the <code>repeat</code> value.</p>
<p>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 <code>ev_timer</code> with <code>after</code>=<code>repeat</code>=<code>60</code> and calling
+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 <code>ev_timer</code> with a <code>repeat</code> value of <code>60</code> and then call
<code>ev_timer_again</code> 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 stop the timer, and again will automatically restart it if
-need be.</p>
- <p>You can also ignore the <code>after</code> value and <code>ev_timer_start</code> altogether
-and only ever use the <code>repeat</code> value:</p>
+socket, you can <code>ev_timer_stop</code> the timer, and <code>ev_timer_again</code> will
+automatically restart it if need be.</p>
+ <p>That means you can ignore the <code>after</code> value and <code>ev_timer_start</code>
+altogether and only ever use the <code>repeat</code> value and <code>ev_timer_again</code>:</p>
<pre> ev_timer_init (timer, callback, 0., 5.);
ev_timer_again (loop, timer);
...
ev_timer_again (loop, timer);
</pre>
- <p>This is more efficient then stopping/starting the timer eahc time you want
-to modify its timeout value.</p>
+ <p>This is more slightly efficient then stopping/starting the timer each time
+you want to modify its timeout value.</p>
</dd>
<dt>ev_tstamp repeat [read-write]</dt>
<dd>
not exist" is signified by the <code>st_nlink</code> 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.</p>
+<p>The path <i>should</i> be absolute and <i>must not</i> end in a slash. If it is
+relative and your working directory changes, the behaviour is undefined.</p>
<p>Since there is no standard to do this, the portable implementation simply
-calls <code>stat (2)</code> regulalry on the path to see if it changed somehow. You
+calls <code>stat (2)</code> 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 <code>0</code> (highly recommended!) then a <i>suitable,
unspecified default</i> value will be used (which you can expect to be around
<p>This watcher type is not meant for massive numbers of stat watchers,
as even with OS-supported change notifications, this can be
resource-intensive.</p>
-<p>At the time of this writing, no specific OS backends are implemented, but
-if demand increases, at least a kqueue and inotify backend will be added.</p>
+<p>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 <code>ev_stat</code> 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.</p>
<dl>
<dt>ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)</dt>
<dt>ev_stat_set (ev_stat *, const char *path, ev_tstamp interval)</dt>
loop, if multiple loops are supported ("ev loop default").</p>
</dd>
</dl>
-<p>Example: Declare and initialise a check watcher, working regardless of
-wether multiple loops are supported or not.</p>
+<p>Example: Declare and initialise a check watcher, utilising the above
+macros so it will work regardless of wether multiple loops are supported
+or not.</p>
<pre> static void
check_cb (EV_P_ ev_timer *w, int revents)
{
ev_check_start (EV_DEFAULT_ &check);
ev_loop (EV_DEFAULT_ 0);
-
-
-
</pre>
</div>
ev_win32.c required on win32 platforms only
- ev_select.c only when select backend is enabled (which is by default)
+ 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)
<dd>
<p>reserved for future expansion, works like the USE symbols above.</p>
</dd>
+ <dt>EV_USE_INOTIFY</dt>
+ <dd>
+ <p>If defined to be <code>1</code>, libev will compile in support for the Linux inotify
+interface to speed up <code>ev_stat</code> watchers. Its actual availability will
+be detected at runtime.</p>
+ </dd>
<dt>EV_H</dt>
<dd>
<p>The name of the <cite>ev.h</cite> header file used to include it. The default if
<p><code>ev_child</code> watchers use a small hash table to distribute workload by
pid. The default size is <code>16</code> (or <code>1</code> with <code>EV_MINIMAL</code>), usually more
than enough. If you need to manage thousands of children you might want to
-increase this value.</p>
+increase this value (<i>must</i> be a power of two).</p>
+ </dd>
+ <dt>EV_INOTIFY_HASHSIZE</dt>
+ <dd>
+ <p><code>ev_staz</code> watchers use a small hash table to distribute workload by
+inotify watch id. The default size is <code>16</code> (or <code>1</code> with <code>EV_MINIMAL</code>),
+usually more than enough. If you need to manage thousands of <code>ev_stat</code>
+watchers you might want to increase this value (<i>must</i> be a power of
+two).</p>
</dd>
<dt>EV_COMMON</dt>
<dd>
will be compiled. It is pretty complex because it provides its own header
file.</p>
<p>The usage in rxvt-unicode is simpler. It has a <cite>ev_cpp.h</cite> header file
-that everybody includes and which overrides some autoconf choices:</p>
-<pre> #define EV_USE_POLL 0
+that everybody includes and which overrides some configure choices:</p>
+<pre> #define EV_MINIMAL 1
+ #define EV_USE_POLL 0
#define EV_MULTIPLICITY 0
- #define EV_PERIODICS 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"
<dt>Changing timer/periodic watchers (by autorepeat, again): O(log skipped_other_timers)</dt>
<dt>Starting io/check/prepare/idle/signal/child watchers: O(1)</dt>
<dt>Stopping check/prepare/idle watchers: O(1)</dt>
- <dt>Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % 16))</dt>
+ <dt>Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % EV_PID_HASHSIZE))</dt>
<dt>Finding the next timer per loop iteration: O(1)</dt>
<dt>Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)</dt>
<dt>Activating one watcher: O(1)</dt>