]> git.llucax.com Git - software/libev.git/blobdiff - ev.pod
*** empty log message ***
[software/libev.git] / ev.pod
diff --git a/ev.pod b/ev.pod
index 3ad52c033150467c481e7a211df16825726e238d..ba1eec4766f7789e80b55f1ebd667a5ee542f9e2 100644 (file)
--- a/ev.pod
+++ b/ev.pod
@@ -100,7 +100,9 @@ Libev represents time as a single floating point number, representing the
 the beginning of 1970, details are complicated, don't ask). This type is
 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
 the beginning of 1970, details are complicated, don't ask). This type is
 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.
+it, you should treat it as some floatingpoint value. Unlike the name
+component C<stamp> might indicate, it is also used for time differences
+throughout libev.
 
 =head1 GLOBAL FUNCTIONS
 
 
 =head1 GLOBAL FUNCTIONS
 
@@ -119,14 +121,17 @@ you actually want to know.
 
 =item int ev_version_minor ()
 
 
 =item int ev_version_minor ()
 
-You can find out the major and minor version numbers of the library
+You can find out the major and minor ABI version numbers of the library
 you linked against by calling the functions C<ev_version_major> and
 C<ev_version_minor>. If you want, you can compare against the global
 symbols C<EV_VERSION_MAJOR> and C<EV_VERSION_MINOR>, which specify the
 version of the library your program was compiled against.
 
 you linked against by calling the functions C<ev_version_major> and
 C<ev_version_minor>. If you want, you can compare against the global
 symbols C<EV_VERSION_MAJOR> and C<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,
 Usually, it's a good idea to terminate if the major versions mismatch,
-as this indicates an incompatible change.  Minor versions are usually
+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.
 
 compatible to older versions, so a larger minor version alone is usually
 not a problem.
 
@@ -401,9 +406,18 @@ etc.). None of the active event watchers will be stopped in the normal
 sense, so e.g. C<ev_is_active> might still return true. It is your
 responsibility to either stop all watchers cleanly yoursef I<before>
 calling this function, or cope with the fact afterwards (which is usually
 sense, so e.g. C<ev_is_active> might still return true. It is your
 responsibility to either stop all watchers cleanly yoursef I<before>
 calling this function, or cope with the fact afterwards (which is usually
-the easiest thing, youc na just ignore the watchers and/or C<free ()> them
+the easiest thing, you can just ignore the watchers and/or C<free ()> them
 for example).
 
 for example).
 
+Not that certain global state, such as signal state, will not be freed by
+this function, and related watchers (such as signal and child watchers)
+would need to be stopped manually.
+
+In general it is not advisable to call this function except in the
+rare occasion where you really need to free e.g. the signal handling
+pipe fds. If you need dynamically allocated loops it is better to use
+C<ev_loop_new> and C<ev_loop_destroy>).
+
 =item ev_loop_destroy (loop)
 
 Like C<ev_default_destroy>, but destroys an event loop created by an
 =item ev_loop_destroy (loop)
 
 Like C<ev_default_destroy>, but destroys an event loop created by an
@@ -910,6 +924,30 @@ 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).
 
 such as poll (fortunately in our Xlib example, Xlib already does this on
 its own, so its quite safe to use).
 
+=head3 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 C<close> explicitly or by any other means,
+such as C<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 C<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 I<have> to call C<ev_io_set> (or C<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.
+
+
+=head3 Watcher-Specific Functions
+
 =over 4
 
 =item ev_io_init (ev_io *, callback, int fd, int events)
 =over 4
 
 =item ev_io_init (ev_io *, callback, int fd, int events)
@@ -972,6 +1010,8 @@ 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.
 
 but if multiple timers become ready during the same loop iteration then
 order of execution is undefined.
 
+=head3 Watcher-Specific Functions and Data Members
+
 =over 4
 
 =item ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)
 =over 4
 
 =item ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)
@@ -1086,6 +1126,8 @@ As with timers, the callback is guarenteed to be invoked only when the
 time (C<at>) has been passed, but if multiple periodic timers become ready
 during the same loop iteration then order of execution is undefined.
 
 time (C<at>) has been passed, but if multiple periodic timers become ready
 during the same loop iteration then order of execution is undefined.
 
+=head3 Watcher-Specific Functions and Data Members
+
 =over 4
 
 =item ev_periodic_init (ev_periodic *, callback, ev_tstamp at, ev_tstamp interval, reschedule_cb)
 =over 4
 
 =item ev_periodic_init (ev_periodic *, callback, ev_tstamp at, ev_tstamp interval, reschedule_cb)
@@ -1191,6 +1233,11 @@ 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.
 
 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.
 
+=item ev_tstamp at [read-only]
+
+When active, contains the absolute time that the watcher is supposed to
+trigger next.
+
 =back
 
 Example: Call a callback every hour, or, more precisely, whenever the
 =back
 
 Example: Call a callback every hour, or, more precisely, whenever the
@@ -1241,6 +1288,8 @@ 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 for a signal is stopped libev will reset the signal handler to
 SIG_DFL (regardless of what it was set to before).
 
+=head3 Watcher-Specific Functions and Data Members
+
 =over 4
 
 =item ev_signal_init (ev_signal *, callback, int signum)
 =over 4
 
 =item ev_signal_init (ev_signal *, callback, int signum)
@@ -1262,6 +1311,8 @@ The signal the watcher watches out for.
 Child watchers trigger when your process receives a SIGCHLD in response to
 some child status changes (most typically when a child of yours dies).
 
 Child watchers trigger when your process receives a SIGCHLD in response to
 some child status changes (most typically when a child of yours dies).
 
+=head3 Watcher-Specific Functions and Data Members
+
 =over 4
 
 =item ev_child_init (ev_child *, callback, int pid)
 =over 4
 
 =item ev_child_init (ev_child *, callback, int pid)
@@ -1339,6 +1390,8 @@ 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.
 
 usually detected immediately, and if the file exists there will be no
 polling.
 
+=head3 Watcher-Specific Functions and Data Members
+
 =over 4
 
 =item ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)
 =over 4
 
 =item ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)
@@ -1430,6 +1483,8 @@ 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.
 
 "pseudo-background processing", or delay processing stuff to after the
 event loop has handled all outstanding events.
 
+=head3 Watcher-Specific Functions and Data Members
+
 =over 4
 
 =item ev_idle_init (ev_signal *, callback)
 =over 4
 
 =item ev_idle_init (ev_signal *, callback)
@@ -1506,6 +1561,8 @@ loops those other event loops might be in an unusable state until their
 C<ev_check> watcher ran (always remind yourself to coexist peacefully with
 others).
 
 C<ev_check> watcher ran (always remind yourself to coexist peacefully with
 others).
 
+=head3 Watcher-Specific Functions and Data Members
+
 =over 4
 
 =item ev_prepare_init (ev_prepare *, callback)
 =over 4
 
 =item ev_prepare_init (ev_prepare *, callback)
@@ -1716,6 +1773,8 @@ create it, and if that fails, use the normal loop for everything:
   else
     loop_lo = loop_hi;
 
   else
     loop_lo = loop_hi;
 
+=head3 Watcher-Specific Functions and Data Members
+
 =over 4
 
 =item ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)
 =over 4
 
 =item ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)
@@ -1751,6 +1810,8 @@ 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.
 
 C<ev_default_fork> cheats and calls it in the wrong process, the fork
 handlers will be invoked, too, of course.
 
+=head3 Watcher-Specific Functions and Data Members
+
 =over 4
 
 =item ev_fork_init (ev_signal *, callback)
 =over 4
 
 =item ev_fork_init (ev_signal *, callback)
@@ -1976,16 +2037,16 @@ constructor already stores the event loop.
 
 Stops the watcher if it is active. Again, no C<loop> argument.
 
 
 Stops the watcher if it is active. Again, no C<loop> argument.
 
-=item w->again ()       C<ev::timer>, C<ev::periodic> only
+=item w->again () (C<ev::timer>, C<ev::periodic> only)
 
 For C<ev::timer> and C<ev::periodic>, this invokes the corresponding
 C<ev_TYPE_again> function.
 
 
 For C<ev::timer> and C<ev::periodic>, this invokes the corresponding
 C<ev_TYPE_again> function.
 
-=item w->sweep ()       C<ev::embed> only
+=item w->sweep () (C<ev::embed> only)
 
 Invokes C<ev_embed_sweep>.
 
 
 Invokes C<ev_embed_sweep>.
 
-=item w->update ()      C<ev::stat> only
+=item w->update () (C<ev::stat> only)
 
 Invokes C<ev_stat_stat>.
 
 
 Invokes C<ev_stat_stat>.
 
@@ -2015,9 +2076,9 @@ the constructor.
 
 =head1 MACRO MAGIC
 
 
 =head1 MACRO MAGIC
 
-Libev can be compiled with a variety of options, the most fundemantal is
-C<EV_MULTIPLICITY>. This option determines whether (most) functions and
-callbacks have an initial C<struct ev_loop *> argument.
+Libev can be compiled with a variety of options, the most fundamantal
+of which is C<EV_MULTIPLICITY>. This option determines whether (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:
 
 To make it easier to write programs that cope with either variant, the
 following macros are defined: