|
|
|
@ -646,7 +646,7 @@ This function is rarely useful, but when some event callback runs for a
|
|
|
|
|
very long time without entering the event loop, updating libev's idea of
|
|
|
|
|
the current time is a good idea.
|
|
|
|
|
|
|
|
|
|
See also "The special problem of time updates" in the C<ev_timer> section.
|
|
|
|
|
See also L<The special problem of time updates> in the C<ev_timer> section.
|
|
|
|
|
|
|
|
|
|
=item ev_suspend (loop)
|
|
|
|
|
|
|
|
|
@ -2710,6 +2710,39 @@ 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.
|
|
|
|
|
|
|
|
|
|
=head3 The special problem of life after fork - how is it possible?
|
|
|
|
|
|
|
|
|
|
Most uses of C<fork()> consist of forking, then some simple calls to ste
|
|
|
|
|
up/change the process environment, followed by a call to C<exec()>. This
|
|
|
|
|
sequence should be handled by libev without any problems.
|
|
|
|
|
|
|
|
|
|
This changes when the application actually wants to do event handling
|
|
|
|
|
in the child, or both parent in child, in effect "continuing" after the
|
|
|
|
|
fork.
|
|
|
|
|
|
|
|
|
|
The default mode of operation (for libev, with application help to detect
|
|
|
|
|
forks) is to duplicate all the state in the child, as would be expected
|
|
|
|
|
when I<either> the parent I<or> the child process continues.
|
|
|
|
|
|
|
|
|
|
When both processes want to continue using libev, then this is usually the
|
|
|
|
|
wrong result. In that case, usually one process (typically the parent) is
|
|
|
|
|
supposed to continue with all watchers in place as before, while the other
|
|
|
|
|
process typically wants to start fresh, i.e. without any active watchers.
|
|
|
|
|
|
|
|
|
|
The cleanest and most efficient way to achieve that with libev is to
|
|
|
|
|
simply create a new event loop, which of course will be "empty", and
|
|
|
|
|
use that for new watchers. This has the advantage of not touching more
|
|
|
|
|
memory than necessary, and thus avoiding the copy-on-write, and the
|
|
|
|
|
disadvantage of having to use multiple event loops (which do not support
|
|
|
|
|
signal watchers).
|
|
|
|
|
|
|
|
|
|
When this is not possible, or you want to use the default loop for
|
|
|
|
|
other reasons, then in the process that wants to start "fresh", call
|
|
|
|
|
C<ev_default_destroy ()> followed by C<ev_default_loop (...)>. Destroying
|
|
|
|
|
the default loop will "orphan" (not stop) all registered watchers, so you
|
|
|
|
|
have to be careful not to execute code that modifies those watchers. Note
|
|
|
|
|
also that in that case, you have to re-register any signal watchers.
|
|
|
|
|
|
|
|
|
|
=head3 Watcher-Specific Functions and Data Members
|
|
|
|
|
|
|
|
|
|
=over 4
|
|
|
|
|