--- libev/ev.pod 2012/05/04 20:22:27 1.409 +++ libev/ev.pod 2013/11/22 16:42:10 1.431 @@ -1,3 +1,5 @@ +=encoding utf-8 + =head1 NAME libev - a high performance full-featured event loop written in C @@ -84,9 +86,9 @@ This manual tries to be very detailed, but unfortunately, this also makes it very long. If you just want to know the basics of libev, I suggest -reading L, then the L above and -look up the missing functions in L and the C and -C sections in L. +reading L, then the L above and +look up the missing functions in L and the C and +C sections in L. =head1 ABOUT LIBEV @@ -398,8 +400,10 @@ or setgid) then libev will I look at the environment variable C. Otherwise (the default), this environment variable will 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. +useful to try out specific backends to test their performance, to work +around bugs, or to make libev threadsafe (accessing environment variables +cannot be done in a threadsafe way, but usually it works if no other +thread modifies them). =item C @@ -571,7 +575,7 @@ cause an extra system call as with C, it still adds up to two event changes per incident. Support for C is very bad (you might have to leak fd's on fork, but it's more sane than epoll) and it -drops fds silently in similarly hard-to-detect cases +drops fds silently in similarly hard-to-detect cases. This backend usually performs well under most conditions. @@ -686,7 +690,7 @@ the child process. You I call it (or use C) in the child before resuming or calling C. -Again, you I to call it on I loop that you want to re-use after +Again, you I to call it on I loop that you want to re-use after a fork, I. This is because some kernel interfaces *cough* I *cough* do funny things during fork. @@ -766,7 +770,7 @@ very long time without entering the event loop, updating libev's idea of the current time is a good idea. -See also L in the C section. +See also L in the C section. =item ev_suspend (loop) @@ -1348,7 +1352,7 @@ The default priority used by watchers when no priority has been set is always C<0>, which is supposed to not be too high and not be too low :). -See L, below, for a more thorough treatment of +See L, below, for a more thorough treatment of priorities. =item ev_invoke (loop, ev_TYPE *watcher, int revents) @@ -1383,7 +1387,7 @@ =back -See also the L and L and L idioms. =head2 WATCHER STATES @@ -1395,7 +1399,7 @@ =over 4 -=item initialiased +=item initialised Before a watcher can be registered with the event loop it has to be initialised. This can be done with a call to C, or calls to @@ -2138,7 +2142,7 @@ =back -This sounds a bit complicated, see L, above, for a +This sounds a bit complicated, see L, above, for a usage example. =item ev_tstamp ev_timer_remaining (loop, ev_timer *) @@ -2411,9 +2415,9 @@ C in both the default loop and another loop at the same time. At the moment, C is permanently tied to the default loop. -When the first watcher gets started will libev actually register something -with the kernel (thus it coexists with your own signal handlers as long as -you don't register any with libev for the same signal). +Only after the first watcher for a signal is started will libev actually +register something with the kernel. It thus coexists with your own signal +handlers as long as you don't register any with libev for the same signal. If possible and supported, libev will install its handlers with C (or equivalent) behaviour enabled, so system calls should @@ -2608,8 +2612,9 @@ This watches a file system path for attribute changes. That is, it calls C on that path in regular intervals (or when the OS says it changed) -and sees if it changed compared to the last time, invoking the callback if -it did. +and sees if it changed compared to the last time, invoking the callback +if it did. Starting the watcher C's the file, so only changes that +happen after the watcher has been started will be reported. 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 @@ -2860,7 +2865,7 @@ to do something on each event loop iteration - for example to balance load between different connections. -See L watcher for its side-effect> for a longer +See L for a longer example. =head3 Watcher-Specific Functions and Data Members @@ -2964,7 +2969,6 @@ next event loop iteration. However, that isn't as soon as possible - without external events, your C watcher will not be invoked. - This is where C watchers come in handy - all you need is a single global idle watcher that is active as long as you have one active C watcher. The C watcher makes sure the event loop @@ -3180,7 +3184,7 @@ =item ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop) -=item ev_embed_set (ev_embed *, callback, struct ev_loop *embedded_loop) +=item ev_embed_set (ev_embed *, struct ev_loop *embedded_loop) Configures the watcher to embed the given loop, which must be embeddable. If the callback is C<0>, then C will be @@ -3253,11 +3257,11 @@ Fork watchers are called when a C was detected (usually because whoever is a good citizen cared to tell libev about it by calling -C or C). The invocation is done before the -event loop blocks next and before C watchers are being called, -and only in the child after the fork. If whoever good citizen calling -C cheats and calls it in the wrong process, the fork -handlers will be invoked, too, of course. +C). The invocation is done before the event loop blocks next +and before C watchers are being called, and only in the child +after the fork. If whoever good citizen calling C 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? @@ -3661,9 +3665,9 @@ A common way around all these issues is to make sure that C I returns before the callback is invoked. If C immediately knows the result, it can artificially -delay invoking the callback by e.g. using a C or C watcher -for example, or more sneakily, by reusing an existing (stopped) watcher -and pushing it into the pending queue: +delay invoking the callback by using a C or C watcher for +example, or more sneakily, by reusing an existing (stopped) watcher and +pushing it into the pending queue: ev_set_cb (watcher, callback); ev_feed_event (EV_A_ watcher, 0); @@ -3681,7 +3685,7 @@ main C call, but not the nested one (e.g. user clicked "Quit", but a modal "Are you sure?" dialog is still waiting), or just the nested one and not the main one (e.g. user clocked "Ok" in a modal dialog), or some -other combination: In these cases, C will not work alone. +other combination: In these cases, a simple C will not work. The solution is to maintain "break this loop" variable for each C invocation, and use a loop around C until the condition is @@ -3890,7 +3894,7 @@ switching to a coroutine, you push the watcher onto the queue and notify any waiters. -To embed libev, see L, but in short, it's easiest to create two +To embed libev, see L, but in short, it's easiest to create two files, F and F that include the respective libev files: // my_ev.h @@ -3952,7 +3956,7 @@ Proper exception specifications might have to be added to callbacks passed to libev: exceptions may be thrown only from watcher callbacks, all -other callbacks (allocator, syserr, loop acquire/release and periodioc +other callbacks (allocator, syserr, loop acquire/release and periodic reschedule callbacks) must not throw exceptions, and might need a C specification. If you have code that needs to be compiled as both C and C++ you can use the C macro for this: @@ -3982,7 +3986,7 @@ the callback model to a model using method callbacks on objects. To use it, - + #include This automatically includes F and puts all of its definitions (many @@ -4123,10 +4127,14 @@ =item w->set ([arguments]) -Basically the same as C, with the same arguments. Either this -method or a suitable start method must be called at least once. Unlike the -C counterpart, an active watcher gets automatically stopped and restarted -when reconfiguring it with this method. +Basically the same as C (except for C watchers>), +with the same arguments. Either this method or a suitable start method +must be called at least once. Unlike the C counterpart, an active watcher +gets automatically stopped and restarted when reconfiguring it with this +method. + +For C watchers this method is called C, to avoid +clashing with the C method. =item w->start () @@ -4240,6 +4248,14 @@ time of this writing, only C and C), to be found at L. +=item Javascript + +Node.js (L) uses libev as the underlying event library. + +=item Others + +There are others, and I stopped counting. + =back @@ -4548,6 +4564,13 @@ file descriptors again. Note that the replacement function has to close the underlying OS handle. +=item EV_USE_WSASOCKET + +If defined to be C<1>, libev will use C to create its internal +communication socket, which works better in some environments. Otherwise, +the normal C function will be used, which works better in other +environments. + =item EV_USE_POLL If defined to be C<1>, libev will compile in support for the C(2) @@ -4601,23 +4624,22 @@ =item EV_NO_THREADS -If defined to be C<1>, libev will assume that it will never be called -from different threads, which is a stronger assumption than C, -above. This reduces dependencies and makes libev faster. +If defined to be C<1>, libev will assume that it will never be called from +different threads (that includes signal handlers), which is a stronger +assumption than C, above. This reduces dependencies and makes +libev faster. =item EV_ATOMIC_T Libev requires an integer type (suitable for storing C<0> or C<1>) whose -access is atomic and serialised with respect to other threads or signal -contexts. No such type is easily found in the C language, so you can -provide your own type that you know is safe for your purposes. It is used -both for signal handler "locking" as well as for signal and thread safety -in C watchers. +access is atomic with respect to other threads or signal contexts. No +such type is easily found in the C language, so you can provide your own +type that you know is safe for your purposes. It is used both for signal +handler "locking" as well as for signal and thread safety in C +watchers. In the absence of this define, libev will use C -(from F), which is usually good enough on most platforms, -although strictly speaking using a type that also implies a memory fence -is required. +(from F), which is usually good enough on most platforms. =item EV_H (h) @@ -4995,7 +5017,7 @@ =back -See also L. +See also L. =head3 COROUTINES @@ -5296,8 +5318,8 @@ C could complicate things, however. The most portable way to handle signals is to block signals in all threads -except the initial one, and run the default loop in the initial thread as -well. +except the initial one, and run the signal handling loop in the initial +thread as well. =item C must be large enough for common memory allocation sizes @@ -5411,7 +5433,7 @@ =item C backwards compatibility mechanism The backward compatibility mechanism can be controlled by -C. See L in the L +C. See L in the L section. =item C and C have been removed @@ -5464,7 +5486,7 @@ =item active A watcher is active as long as it has been started and not yet stopped. -See L for details. +See L for details. =item application @@ -5510,7 +5532,7 @@ =item pending A watcher is pending as soon as the corresponding event has been -detected. See L for details. +detected. See L for details. =item real time