]> git.llucax.com Git - software/libev.git/blobdiff - ev.3
*** empty log message ***
[software/libev.git] / ev.3
diff --git a/ev.3 b/ev.3
index 4f3bfef260a4f1ff7f864522a6e7256967f64b6b..86f8a570ee1e85089d785e65f6a60c32f3c1e3ae 100644 (file)
--- a/ev.3
+++ b/ev.3
 .\" ========================================================================
 .\"
 .IX Title ""<STANDARD INPUT>" 1"
 .\" ========================================================================
 .\"
 .IX Title ""<STANDARD INPUT>" 1"
-.TH "<STANDARD INPUT>" 1 "2007-12-09" "perl v5.8.8" "User Contributed Perl Documentation"
+.TH "<STANDARD INPUT>" 1 "2007-12-12" "perl v5.8.8" "User Contributed Perl Documentation"
 .SH "NAME"
 libev \- a high performance full\-featured event loop written in C
 .SH "SYNOPSIS"
 .SH "NAME"
 libev \- a high performance full\-featured event loop written in C
 .SH "SYNOPSIS"
@@ -1067,6 +1067,31 @@ 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).
 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).
+.PP
+\fIThe special problem of disappearing file descriptors\fR
+.IX Subsection "The special problem of disappearing file descriptors"
+.PP
+Some backends (e.g kqueue, epoll) need to be told about closing a file
+descriptor (either by calling \f(CW\*(C`close\*(C'\fR explicitly or by any other means,
+such as \f(CW\*(C`dup\*(C'\fR). 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.
+.PP
+To avoid having to explicitly tell libev about such cases, libev follows
+the following policy:  Each time \f(CW\*(C`ev_io_set\*(C'\fR 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 \fIhave\fR to call \f(CW\*(C`ev_io_set\*(C'\fR (or \f(CW\*(C`ev_io_init\*(C'\fR) when you change the
+descriptor even if the file descriptor number itself did not change.
+.PP
+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.
+.PP
+\fIWatcher-Specific Functions\fR
+.IX Subsection "Watcher-Specific Functions"
 .IP "ev_io_init (ev_io *, callback, int fd, int events)" 4
 .IX Item "ev_io_init (ev_io *, callback, int fd, int events)"
 .PD 0
 .IP "ev_io_init (ev_io *, callback, int fd, int events)" 4
 .IX Item "ev_io_init (ev_io *, callback, int fd, int events)"
 .PD 0
@@ -1129,6 +1154,9 @@ on the current time, use something like this to adjust for this:
 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.
 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.
+.PP
+\fIWatcher-Specific Functions and Data Members\fR
+.IX Subsection "Watcher-Specific Functions and Data Members"
 .IP "ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)" 4
 .IX Item "ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)"
 .PD 0
 .IP "ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)" 4
 .IX Item "ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)"
 .PD 0
@@ -1249,6 +1277,9 @@ rules.
 As with timers, the callback is guarenteed to be invoked only when the
 time (\f(CW\*(C`at\*(C'\fR) has been passed, but if multiple periodic timers become ready
 during the same loop iteration then order of execution is undefined.
 As with timers, the callback is guarenteed to be invoked only when the
 time (\f(CW\*(C`at\*(C'\fR) has been passed, but if multiple periodic timers become ready
 during the same loop iteration then order of execution is undefined.
+.PP
+\fIWatcher-Specific Functions and Data Members\fR
+.IX Subsection "Watcher-Specific Functions and Data Members"
 .IP "ev_periodic_init (ev_periodic *, callback, ev_tstamp at, ev_tstamp interval, reschedule_cb)" 4
 .IX Item "ev_periodic_init (ev_periodic *, callback, ev_tstamp at, ev_tstamp interval, reschedule_cb)"
 .PD 0
 .IP "ev_periodic_init (ev_periodic *, callback, ev_tstamp at, ev_tstamp interval, reschedule_cb)" 4
 .IX Item "ev_periodic_init (ev_periodic *, callback, ev_tstamp at, ev_tstamp interval, reschedule_cb)"
 .PD 0
@@ -1409,6 +1440,9 @@ 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
 \&\s-1SIG_DFL\s0 (regardless of what it was set to before).
 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
 \&\s-1SIG_DFL\s0 (regardless of what it was set to before).
+.PP
+\fIWatcher-Specific Functions and Data Members\fR
+.IX Subsection "Watcher-Specific Functions and Data Members"
 .IP "ev_signal_init (ev_signal *, callback, int signum)" 4
 .IX Item "ev_signal_init (ev_signal *, callback, int signum)"
 .PD 0
 .IP "ev_signal_init (ev_signal *, callback, int signum)" 4
 .IX Item "ev_signal_init (ev_signal *, callback, int signum)"
 .PD 0
@@ -1425,6 +1459,9 @@ The signal the watcher watches out for.
 .IX Subsection "ev_child - watch out for process status changes"
 Child watchers trigger when your process receives a \s-1SIGCHLD\s0 in response to
 some child status changes (most typically when a child of yours dies).
 .IX Subsection "ev_child - watch out for process status changes"
 Child watchers trigger when your process receives a \s-1SIGCHLD\s0 in response to
 some child status changes (most typically when a child of yours dies).
+.PP
+\fIWatcher-Specific Functions and Data Members\fR
+.IX Subsection "Watcher-Specific Functions and Data Members"
 .IP "ev_child_init (ev_child *, callback, int pid)" 4
 .IX Item "ev_child_init (ev_child *, callback, int pid)"
 .PD 0
 .IP "ev_child_init (ev_child *, callback, int pid)" 4
 .IX Item "ev_child_init (ev_child *, callback, int pid)"
 .PD 0
@@ -1499,6 +1536,9 @@ semantics of \f(CW\*(C`ev_stat\*(C'\fR watchers, which means that libev sometime
 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.
 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.
+.PP
+\fIWatcher-Specific Functions and Data Members\fR
+.IX Subsection "Watcher-Specific Functions and Data Members"
 .IP "ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)" 4
 .IX Item "ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)"
 .PD 0
 .IP "ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)" 4
 .IX Item "ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)"
 .PD 0
@@ -1587,6 +1627,9 @@ Apart from keeping your process non-blocking (which is a useful
 effect on its own sometimes), idle watchers are a good place to do
 \&\*(L"pseudo\-background processing\*(R", or delay processing stuff to after the
 event loop has handled all outstanding events.
 effect on its own sometimes), idle watchers are a good place to do
 \&\*(L"pseudo\-background processing\*(R", or delay processing stuff to after the
 event loop has handled all outstanding events.
+.PP
+\fIWatcher-Specific Functions and Data Members\fR
+.IX Subsection "Watcher-Specific Functions and Data Members"
 .IP "ev_idle_init (ev_signal *, callback)" 4
 .IX Item "ev_idle_init (ev_signal *, callback)"
 Initialises and configures the idle watcher \- it has no parameters of any
 .IP "ev_idle_init (ev_signal *, callback)" 4
 .IX Item "ev_idle_init (ev_signal *, callback)"
 Initialises and configures the idle watcher \- it has no parameters of any
@@ -1661,6 +1704,9 @@ their job. As \f(CW\*(C`ev_check\*(C'\fR watchers are often used to embed other
 loops those other event loops might be in an unusable state until their
 \&\f(CW\*(C`ev_check\*(C'\fR watcher ran (always remind yourself to coexist peacefully with
 others).
 loops those other event loops might be in an unusable state until their
 \&\f(CW\*(C`ev_check\*(C'\fR watcher ran (always remind yourself to coexist peacefully with
 others).
+.PP
+\fIWatcher-Specific Functions and Data Members\fR
+.IX Subsection "Watcher-Specific Functions and Data Members"
 .IP "ev_prepare_init (ev_prepare *, callback)" 4
 .IX Item "ev_prepare_init (ev_prepare *, callback)"
 .PD 0
 .IP "ev_prepare_init (ev_prepare *, callback)" 4
 .IX Item "ev_prepare_init (ev_prepare *, callback)"
 .PD 0
@@ -1917,6 +1963,9 @@ create it, and if that fails, use the normal loop for everything:
 \&  else
 \&    loop_lo = loop_hi;
 .Ve
 \&  else
 \&    loop_lo = loop_hi;
 .Ve
+.PP
+\fIWatcher-Specific Functions and Data Members\fR
+.IX Subsection "Watcher-Specific Functions and Data Members"
 .IP "ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)" 4
 .IX Item "ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)"
 .PD 0
 .IP "ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)" 4
 .IX Item "ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)"
 .PD 0
@@ -1946,6 +1995,9 @@ event loop blocks next and before \f(CW\*(C`ev_check\*(C'\fR watchers are being
 and only in the child after the fork. If whoever good citizen calling
 \&\f(CW\*(C`ev_default_fork\*(C'\fR cheats and calls it in the wrong process, the fork
 handlers will be invoked, too, of course.
 and only in the child after the fork. If whoever good citizen calling
 \&\f(CW\*(C`ev_default_fork\*(C'\fR cheats and calls it in the wrong process, the fork
 handlers will be invoked, too, of course.
+.PP
+\fIWatcher-Specific Functions and Data Members\fR
+.IX Subsection "Watcher-Specific Functions and Data Members"
 .IP "ev_fork_init (ev_signal *, callback)" 4
 .IX Item "ev_fork_init (ev_signal *, callback)"
 Initialises and configures the fork watcher \- it has no parameters of any
 .IP "ev_fork_init (ev_signal *, callback)" 4
 .IX Item "ev_fork_init (ev_signal *, callback)"
 Initialises and configures the fork watcher \- it has no parameters of any