]> git.llucax.com Git - software/libev.git/blobdiff - ev.pod
great idea. radically simplify the method callbacks
[software/libev.git] / ev.pod
diff --git a/ev.pod b/ev.pod
index 3f4a06461c9a6eb09c06da51a47a5491594105bb..cac8de1f477cd7bb8962f502f82d18f07201f1d4 100644 (file)
--- a/ev.pod
+++ b/ev.pod
@@ -6,6 +6,48 @@ libev - a high performance full-featured event loop written in C
 
   #include <ev.h>
 
+=head1 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;
+  }
+
 =head1 DESCRIPTION
 
 Libev is an event loop: you register interest in certain events (such as a
@@ -23,23 +65,28 @@ watcher.
 
 =head1 FEATURES
 
-Libev supports select, poll, the linux-specific epoll and the bsd-specific
-kqueue mechanisms for file descriptor events, relative timers, absolute
-timers with customised rescheduling, signal events, process status change
-events (related to SIGCHLD), and event watchers dealing with the event
-loop mechanism itself (idle, prepare and check watchers). It also is quite
-fast (see this L<benchmark|http://libev.schmorp.de/bench.html> comparing
-it to libevent for example).
+Libev supports C<select>, C<poll>, the linux-specific C<epoll>, the
+bsd-specific C<kqueue> and the solaris-specific event port mechanisms
+for file descriptor events (C<ev_io>), relative timers (C<ev_timer>),
+absolute timers with customised rescheduling (C<ev_periodic>), synchronous
+signals (C<ev_signal>), process status change events (C<ev_child>), and
+event watchers dealing with the event loop mechanism itself (C<ev_idle>,
+C<ev_embed>, C<ev_prepare> and C<ev_check> watchers) as well as
+file watchers (C<ev_stat>) and even limited support for fork events
+(C<ev_fork>).
+
+It also is quite fast (see this
+L<benchmark|http://libev.schmorp.de/bench.html> comparing it to libevent
+for example).
 
 =head1 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 the file
-F<README.embed> in the libev distribution. If libev was configured without
-support for multiple event loops, then all functions taking an initial
-argument of name C<loop> (which is always of type C<struct ev_loop *>)
-will not have this argument.
+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 B<EMBED> section in
+this manual. If libev was configured without support for multiple event
+loops, then all functions taking an initial argument of name C<loop>
+(which is always of type C<struct ev_loop *>) will not have this argument.
 
 =head1 TIME REPRESENTATION
 
@@ -50,7 +97,6 @@ called C<ev_tstamp>, which is what you should use too. It usually aliases
 to the C<double> type in C, and when you need to do any calculations on
 it, you should treat it as such.
 
-
 =head1 GLOBAL FUNCTIONS
 
 These functions can be called anytime, even before initialising the
@@ -79,8 +125,8 @@ 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:
+Example: Make sure we haven't accidentally been linked against the wrong
+version.
 
   assert (("libev version mismatch",
            ev_version_major () == EV_VERSION_MAJOR
@@ -118,23 +164,23 @@ recommended ones.
 
 See the description of C<ev_embed> watchers for more info.
 
-=item ev_set_allocator (void *(*cb)(void *ptr, long size))
+=item ev_set_allocator (void *(*cb)(void *ptr, size_t size))
 
-Sets the allocation function to use (the prototype is similar to the
-realloc C function, the semantics are identical). 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.
+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.
 
 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: better than mine).
+Example: Replace the libev allocator with one that waits a bit and then
+retries).
 
    static void *
-   persistent_realloc (void *ptr, long size)
+   persistent_realloc (void *ptr, size_t size)
    {
      for (;;)
        {
@@ -160,7 +206,7 @@ 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: do the same thing as libev does internally:
+Example: This is basically the same thing that libev does internally, too.
 
    static void
    fatal_error (const char *msg)
@@ -316,7 +362,7 @@ 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.
+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)
@@ -425,7 +471,7 @@ Here are the gory details of what C<ev_loop> does:
    - 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
+Example: Queue some jobs and then loop until no events are outsanding
 anymore.
 
    ... queue jobs here, make sure they register event watchers as long
@@ -455,18 +501,18 @@ 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 I<unref after start> and I<ref before stop>.
 
-Example: create a signal watcher, but keep it from keeping C<ev_loop>
+Example: Create a signal watcher, but keep it from keeping C<ev_loop>
 running when nothing else is active.
 
-  struct dv_signal exitsig;
+  struct ev_signal exitsig;
   ev_signal_init (&exitsig, sig_cb, SIGINT);
-  ev_signal_start (myloop, &exitsig);
-  evf_unref (myloop);
+  ev_signal_start (loop, &exitsig);
+  evf_unref (loop);
 
-Example: for some weird reason, unregister the above signal handler again.
+Example: For some weird reason, unregister the above signal handler again.
 
-  ev_ref (myloop);
-  ev_signal_stop (myloop, &exitsig);
+  ev_ref (loop);
+  ev_signal_stop (loop, &exitsig);
 
 =back
 
@@ -547,6 +593,10 @@ The signal specified in the C<ev_signal> watcher has been received by a thread.
 
 The pid specified in the C<ev_child> watcher has received a status change.
 
+=item C<EV_STAT>
+
+The path specified in the C<ev_stat> watcher changed its attributes somehow.
+
 =item C<EV_IDLE>
 
 The C<ev_idle> watcher has determined that you have nothing better to do.
@@ -563,6 +613,15 @@ many watchers as they want, and all of them will be taken into account
 (for example, a C<ev_prepare> watcher might start an idle watcher to keep
 C<ev_loop> from blocking).
 
+=item C<EV_EMBED>
+
+The embedded event loop specified in the C<ev_embed> watcher needs attention.
+
+=item C<EV_FORK>
+
+The event loop has been resumed in the child process after fork (see
+C<ev_fork>).
+
 =item C<EV_ERROR>
 
 An unspecified error has occured, the watcher has been stopped. This might
@@ -646,7 +705,7 @@ is pending (but not active) you must not call an init function on it (but
 C<ev_TYPE_set> is safe) and you must make sure the watcher is available to
 libev (e.g. you cnanot C<free ()> it).
 
-=item callback ev_cb (ev_TYPE *watcher)
+=item callback ev_cb (ev_TYPE *watcher)
 
 Returns the callback currently set on the watcher.
 
@@ -684,14 +743,53 @@ can cast it back to your own type:
     ...
   }
 
-More interesting and less C-conformant ways of catsing your callback type
-have been omitted....
+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 C<my_biggy> is a bit more complicated,
+you need to use C<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));
+  }
 
 
 =head1 WATCHER TYPES
 
 This section describes each watcher in detail, but will not repeat
-information given in the last section.
+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 I<[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 I<[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.
 
 
 =head2 C<ev_io> - is this file descriptor readable or writable?
@@ -744,11 +842,19 @@ Configures an C<ev_io> watcher. The C<fd> is the file descriptor to
 rceeive events for and events is either C<EV_READ>, C<EV_WRITE> or
 C<EV_READ | EV_WRITE> to receive the given events.
 
+=item int fd [read-only]
+
+The file descriptor being watched.
+
+=item int events [read-only]
+
+The events being watched.
+
 =back
 
-Example: call C<stdin_readable_cb> when STDIN_FILENO has become, well
+Example: Call C<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:
+attempt to read a whole line in the callback.
 
   static void
   stdin_readable_cb (struct ev_loop *loop, struct ev_io *w, int revents)
@@ -816,17 +922,39 @@ 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 C<ev_timer> with after=repeat=60 and calling 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 stop
-the timer, and again will automatically restart it if need be.
+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 C<ev_timer> with C<after>=C<repeat>=C<60> and calling
+C<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 stop the timer, and again will automatically restart it if
+need be.
+
+You can also ignore the C<after> value and C<ev_timer_start> altogether
+and only ever use the C<repeat> value:
+
+   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 efficient then stopping/starting the timer eahc time you want
+to modify its timeout value.
+
+=item ev_tstamp repeat [read-write]
+
+The current C<repeat> value. Will be used each time the watcher times out
+or C<ev_timer_again> is called and determines the next timeout (if any),
+which is also when any modifications are taken into account.
 
 =back
 
-Example: create a timer that fires after 60 seconds.
+Example: Create a timer that fires after 60 seconds.
 
   static void
   one_minute_cb (struct ev_loop *loop, struct ev_timer *w, int revents)
@@ -838,7 +966,7 @@ Example: create a timer that fires after 60 seconds.
   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
+Example: Create a timeout timer that times out after 10 seconds of
 inactivity.
 
   static void
@@ -959,9 +1087,21 @@ 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).
 
+=item 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 C<ev_periodic_again> is being
+called.
+
+=item ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now) [read-write]
+
+The current reschedule callback, or C<0>, if this functionality is
+switched off. Can be changed any time, but changes only take effect when
+the periodic timer fires or C<ev_periodic_again> is being called.
+
 =back
 
-Example: call a callback every hour, or, more precisely, whenever the
+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.
 
@@ -975,7 +1115,7 @@ potentially a lot of jittering, but good long-term stability.
   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:
+Example: The same as above, but use a reschedule callback to do it:
 
   #include <math.h>
 
@@ -987,7 +1127,7 @@ Example: the same as above, but use a reschedule callback to do it:
 
   ev_periodic_init (&hourly_tick, clock_cb, 0., 0., my_scheduler_cb);
 
-Example: call a callback every hour, starting now:
+Example: Call a callback every hour, starting now:
 
   struct ev_periodic hourly_tick;
   ev_periodic_init (&hourly_tick, clock_cb,
@@ -1018,6 +1158,10 @@ SIG_DFL (regardless of what it was set to before).
 Configures the watcher to trigger on the given signal number (usually one
 of the C<SIGxxx> constants).
 
+=item int signum [read-only]
+
+The signal the watcher watches out for.
+
 =back
 
 
@@ -1039,9 +1183,22 @@ the status word (use the macros from C<sys/wait.h> and see your systems
 C<waitpid> documentation). The C<rpid> member contains the pid of the
 process causing the status change.
 
+=item int pid [read-only]
+
+The process id this watcher watches out for, or C<0>, meaning any process id.
+
+=item int rpid [read-write]
+
+The process id that detected a status change.
+
+=item int rstatus [read-write]
+
+The process exit/trace status caused by C<rpid> (see your systems
+C<waitpid> and C<sys/wait.h> documentation for details).
+
 =back
 
-Example: try to exit cleanly on SIGINT and SIGTERM.
+Example: Try to exit cleanly on SIGINT and SIGTERM.
 
   static void
   sigint_cb (struct ev_loop *loop, struct ev_signal *w, int revents)
@@ -1054,6 +1211,104 @@ Example: try to exit cleanly on SIGINT and SIGTERM.
   ev_signal_start (loop, &sigint_cb);
 
 
+=head2 C<ev_stat> - did the file attributes just change?
+
+This watches a filesystem path for attribute changes. That is, it calls
+C<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 C<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.
+
+Since there is no standard to do this, the portable implementation simply
+calls C<stat (2)> regulalry 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 C<0> (highly recommended!) then a I<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 C<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, no specific OS backends are implemented, but
+if demand increases, at least a kqueue and inotify backend will be added.
+
+=over 4
+
+=item ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)
+
+=item ev_stat_set (ev_stat *, const char *path, ev_tstamp interval)
+
+Configures the watcher to wait for status changes of the given
+C<path>. The C<interval> is a hint on how quickly a change is expected to
+be detected and should normally be specified as C<0> to let libev choose
+a suitable value. The memory pointed to by C<path> must point to the same
+path for as long as the watcher is active.
+
+The callback will be receive C<EV_STAT> when a change was detected,
+relative to the attributes at the time the watcher was started (or the
+last change was detected).
+
+=item 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.
+
+=item ev_statdata attr [read-only]
+
+The most-recently detected attributes of the file. Although the type is of
+C<ev_statdata>, this is usually the (or one of the) C<struct stat> types
+suitable for your system. If the C<st_nlink> member is C<0>, then there
+was some error while C<stat>ing the file.
+
+=item ev_statdata prev [read-only]
+
+The previous attributes of the file. The callback gets invoked whenever
+C<prev> != C<attr>.
+
+=item ev_tstamp interval [read-only]
+
+The specified interval.
+
+=item const char *path [read-only]
+
+The filesystem path that is being watched.
+
+=back
+
+Example: Watch C</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);
+
+
 =head2 C<ev_idle> - when you've got nothing better to do...
 
 Idle watchers trigger events when there are no other events are pending
@@ -1082,8 +1337,8 @@ believe me.
 
 =back
 
-Example: dynamically allocate an C<ev_idle>, start it, and in the
-callback, free it. Alos, use no error checking, as usual.
+Example: Dynamically allocate an C<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)
@@ -1294,6 +1549,31 @@ Make a single, non-blocking sweep over the embedded loop. This works
 similarly to C<ev_loop (embedded_loop, EVLOOP_NONBLOCK)>, but in the most
 apropriate way for embedded loops.
 
+=item struct ev_loop *loop [read-only]
+
+The embedded event loop.
+
+=back
+
+
+=head2 C<ev_fork> - the audacity to resume the event loop after a fork
+
+Fork watchers are called when a C<fork ()> was detected (usually because
+whoever is a good citizen cared to tell libev about it by calling
+C<ev_default_fork> or C<ev_loop_fork>). The invocation is done before the
+event loop blocks next and before C<ev_check> watchers are being called,
+and only in the child after the fork. If whoever good citizen calling
+C<ev_default_fork> cheats and calls it in the wrong process, the fork
+handlers will be invoked, too, of course.
+
+=over 4
+
+=item ev_fork_init (ev_signal *, callback)
+
+Initialises and configures the fork watcher - it has no parameters of any
+kind. There is a C<ev_fork_set> macro, but using it is utterly pointless,
+believe me.
+
 =back
 
 
@@ -1465,6 +1745,10 @@ C<ev_TYPE_again> function.
 
 Invokes C<ev_embed_sweep>.
 
+=item w->update ()      C<ev::stat> only
+
+Invokes C<ev_stat_stat>.
+
 =back
 
 =back
@@ -1487,6 +1771,68 @@ the constructor.
     io.start (fd, ev::READ);
   }
 
+
+=head1 MACRO MAGIC
+
+Libev can be compiled with a variety of options, the most fundemantal is
+C<EV_MULTIPLICITY>. This option determines wether (most) functions and
+callbacks have an initial C<struct ev_loop *> argument.
+
+To make it easier to write programs that cope with either variant, the
+following macros are defined:
+
+=over 4
+
+=item C<EV_A>, C<EV_A_>
+
+This provides the loop I<argument> for functions, if one is required ("ev
+loop argument"). The C<EV_A> form is used when this is the sole argument,
+C<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 C<loop> of type C<struct ev_loop *> is in scope,
+which is often provided by the following macro.
+
+=item C<EV_P>, C<EV_P_>
+
+This provides the loop I<parameter> for functions, if one is required ("ev
+loop parameter"). The C<EV_P> form is used when this is the sole parameter,
+C<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 C<loop> of type C<struct ev_loop *>, quite
+suitable for use with C<EV_A>.
+
+=item C<EV_DEFAULT>, C<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").
+
+=back
+
+Example: Declare and initialise a check watcher, working regardless of
+wether 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);
+
+
 =head1 EMBEDDING
 
 Libev can (and often is) directly embedded into host
@@ -1718,12 +2064,24 @@ defined to be C<0>, then they are not.
 If undefined or defined to be C<1>, then stat watchers are supported. If
 defined to be C<0>, then they are not.
 
+=item EV_FORK_ENABLE
+
+If undefined or defined to be C<1>, then fork watchers are supported. If
+defined to be C<0>, then they are not.
+
 =item EV_MINIMAL
 
 If you need to shave off some kilobytes of code at the expense of some
 speed, define this symbol to C<1>. Currently only used for gcc to override
 some inlining decisions, saves roughly 30% codesize of amd64.
 
+=item EV_PID_HASHSIZE
+
+C<ev_child> watchers use a small hash table to distribute workload by
+pid. The default size is C<16> (or C<1> with C<EV_MINIMAL>), usually more
+than enough. If you need to manage thousands of children you might want to
+increase this value.
+
 =item EV_COMMON
 
 By default, all watchers have a C<void *data> member. By redefining