ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libev/ev.pod
(Generate patch)

Comparing libev/ev.pod (file contents):
Revision 1.190 by root, Tue Sep 30 19:34:14 2008 UTC vs.
Revision 1.194 by root, Mon Oct 20 16:08:36 2008 UTC

685C<EVUNLOOP_ONE>, which will make the innermost C<ev_loop> call return, or 685C<EVUNLOOP_ONE>, which will make the innermost C<ev_loop> call return, or
686C<EVUNLOOP_ALL>, which will make all nested C<ev_loop> calls return. 686C<EVUNLOOP_ALL>, which will make all nested C<ev_loop> calls return.
687 687
688This "unloop state" will be cleared when entering C<ev_loop> again. 688This "unloop state" will be cleared when entering C<ev_loop> again.
689 689
690It is safe to call C<ev_unloop> from otuside any C<ev_loop> calls.
691
690=item ev_ref (loop) 692=item ev_ref (loop)
691 693
692=item ev_unref (loop) 694=item ev_unref (loop)
693 695
694Ref/unref can be used to add or remove a reference count on the event 696Ref/unref can be used to add or remove a reference count on the event
2384=over 4 2386=over 4
2385 2387
2386=item queueing from a signal handler context 2388=item queueing from a signal handler context
2387 2389
2388To implement race-free queueing, you simply add to the queue in the signal 2390To implement race-free queueing, you simply add to the queue in the signal
2389handler but you block the signal handler in the watcher callback. Here is an example that does that for 2391handler but you block the signal handler in the watcher callback. Here is
2390some fictitious SIGUSR1 handler: 2392an example that does that for some fictitious SIGUSR1 handler:
2391 2393
2392 static ev_async mysig; 2394 static ev_async mysig;
2393 2395
2394 static void 2396 static void
2395 sigusr1_handler (void) 2397 sigusr1_handler (void)
2502=over 4 2504=over 4
2503 2505
2504=item ev_once (loop, int fd, int events, ev_tstamp timeout, callback) 2506=item ev_once (loop, int fd, int events, ev_tstamp timeout, callback)
2505 2507
2506This function combines a simple timer and an I/O watcher, calls your 2508This function combines a simple timer and an I/O watcher, calls your
2507callback on whichever event happens first and automatically stop both 2509callback on whichever event happens first and automatically stops both
2508watchers. This is useful if you want to wait for a single event on an fd 2510watchers. This is useful if you want to wait for a single event on an fd
2509or timeout without having to allocate/configure/start/stop/free one or 2511or timeout without having to allocate/configure/start/stop/free one or
2510more watchers yourself. 2512more watchers yourself.
2511 2513
2512If C<fd> is less than 0, then no I/O watcher will be started and events 2514If C<fd> is less than 0, then no I/O watcher will be started and the
2513is being ignored. Otherwise, an C<ev_io> watcher for the given C<fd> and 2515C<events> argument is being ignored. Otherwise, an C<ev_io> watcher for
2514C<events> set will be created and started. 2516the given C<fd> and C<events> set will be created and started.
2515 2517
2516If C<timeout> is less than 0, then no timeout watcher will be 2518If C<timeout> is less than 0, then no timeout watcher will be
2517started. Otherwise an C<ev_timer> watcher with after = C<timeout> (and 2519started. Otherwise an C<ev_timer> watcher with after = C<timeout> (and
2518repeat = 0) will be started. While C<0> is a valid timeout, it is of 2520repeat = 0) will be started. C<0> is a valid timeout.
2519dubious value.
2520 2521
2521The callback has the type C<void (*cb)(int revents, void *arg)> and gets 2522The callback has the type C<void (*cb)(int revents, void *arg)> and gets
2522passed an C<revents> set like normal event callbacks (a combination of 2523passed an C<revents> set like normal event callbacks (a combination of
2523C<EV_ERROR>, C<EV_READ>, C<EV_WRITE> or C<EV_TIMEOUT>) and the C<arg> 2524C<EV_ERROR>, C<EV_READ>, C<EV_WRITE> or C<EV_TIMEOUT>) and the C<arg>
2524value passed to C<ev_once>: 2525value passed to C<ev_once>. Note that it is possible to receive I<both>
2526a timeout and an io event at the same time - you probably should give io
2527events precedence.
2528
2529Example: wait up to ten seconds for data to appear on STDIN_FILENO.
2525 2530
2526 static void stdin_ready (int revents, void *arg) 2531 static void stdin_ready (int revents, void *arg)
2527 { 2532 {
2533 if (revents & EV_READ)
2534 /* stdin might have data for us, joy! */;
2528 if (revents & EV_TIMEOUT) 2535 else if (revents & EV_TIMEOUT)
2529 /* doh, nothing entered */; 2536 /* doh, nothing entered */;
2530 else if (revents & EV_READ)
2531 /* stdin might have data for us, joy! */;
2532 } 2537 }
2533 2538
2534 ev_once (STDIN_FILENO, EV_READ, 10., stdin_ready, 0); 2539 ev_once (STDIN_FILENO, EV_READ, 10., stdin_ready, 0);
2535 2540
2536=item ev_feed_event (ev_loop *, watcher *, int revents) 2541=item ev_feed_event (ev_loop *, watcher *, int revents)
3313=head2 THREADS AND COROUTINES 3318=head2 THREADS AND COROUTINES
3314 3319
3315=head3 THREADS 3320=head3 THREADS
3316 3321
3317All libev functions are reentrant and thread-safe unless explicitly 3322All libev functions are reentrant and thread-safe unless explicitly
3318documented otherwise, but it uses no locking itself. This means that you 3323documented otherwise, but libev implements no locking itself. This means
3319can use as many loops as you want in parallel, as long as there are no 3324that you can use as many loops as you want in parallel, as long as there
3320concurrent calls into any libev function with the same loop parameter 3325are no concurrent calls into any libev function with the same loop
3321(C<ev_default_*> calls have an implicit default loop parameter, of 3326parameter (C<ev_default_*> calls have an implicit default loop parameter,
3322course): libev guarantees that different event loops share no data 3327of course): libev guarantees that different event loops share no data
3323structures that need any locking. 3328structures that need any locking.
3324 3329
3325Or to put it differently: calls with different loop parameters can be done 3330Or to put it differently: calls with different loop parameters can be done
3326concurrently from multiple threads, calls with the same loop parameter 3331concurrently from multiple threads, calls with the same loop parameter
3327must be done serially (but can be done from different threads, as long as 3332must be done serially (but can be done from different threads, as long as
3369 3374
3370=back 3375=back
3371 3376
3372=head3 COROUTINES 3377=head3 COROUTINES
3373 3378
3374Libev is much more accommodating to coroutines ("cooperative threads"): 3379Libev is very accommodating to coroutines ("cooperative threads"):
3375libev fully supports nesting calls to it's functions from different 3380libev fully supports nesting calls to its functions from different
3376coroutines (e.g. you can call C<ev_loop> on the same loop from two 3381coroutines (e.g. you can call C<ev_loop> on the same loop from two
3377different coroutines and switch freely between both coroutines running the 3382different coroutines, and switch freely between both coroutines running the
3378loop, as long as you don't confuse yourself). The only exception is that 3383loop, as long as you don't confuse yourself). The only exception is that
3379you must not do this from C<ev_periodic> reschedule callbacks. 3384you must not do this from C<ev_periodic> reschedule callbacks.
3380 3385
3381Care has been taken to ensure that libev does not keep local state inside 3386Care has been taken to ensure that libev does not keep local state inside
3382C<ev_loop>, and other calls do not usually allow coroutine switches. 3387C<ev_loop>, and other calls do not usually allow for coroutine switches as
3388they do not clal any callbacks.
3383 3389
3384=head2 COMPILER WARNINGS 3390=head2 COMPILER WARNINGS
3385 3391
3386Depending on your compiler and compiler settings, you might get no or a 3392Depending on your compiler and compiler settings, you might get no or a
3387lot of warnings when compiling libev code. Some people are apparently 3393lot of warnings when compiling libev code. Some people are apparently
3439annoyed when you get a brisk "this is no bug" answer and take the chance 3445annoyed when you get a brisk "this is no bug" answer and take the chance
3440of learning how to interpret valgrind properly. 3446of learning how to interpret valgrind properly.
3441 3447
3442If you need, for some reason, empty reports from valgrind for your project 3448If you need, for some reason, empty reports from valgrind for your project
3443I suggest using suppression lists. 3449I suggest using suppression lists.
3444
3445
3446
3447=head1 COMPLEXITIES
3448
3449In this section the complexities of (many of) the algorithms used inside
3450libev will be explained. For complexity discussions about backends see the
3451documentation for C<ev_default_init>.
3452
3453All of the following are about amortised time: If an array needs to be
3454extended, libev needs to realloc and move the whole array, but this
3455happens asymptotically never with higher number of elements, so O(1) might
3456mean it might do a lengthy realloc operation in rare cases, but on average
3457it is much faster and asymptotically approaches constant time.
3458
3459=over 4
3460
3461=item Starting and stopping timer/periodic watchers: O(log skipped_other_timers)
3462
3463This means that, when you have a watcher that triggers in one hour and
3464there are 100 watchers that would trigger before that then inserting will
3465have to skip roughly seven (C<ld 100>) of these watchers.
3466
3467=item Changing timer/periodic watchers (by autorepeat or calling again): O(log skipped_other_timers)
3468
3469That means that changing a timer costs less than removing/adding them
3470as only the relative motion in the event queue has to be paid for.
3471
3472=item Starting io/check/prepare/idle/signal/child/fork/async watchers: O(1)
3473
3474These just add the watcher into an array or at the head of a list.
3475
3476=item Stopping check/prepare/idle/fork/async watchers: O(1)
3477
3478=item Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % EV_PID_HASHSIZE))
3479
3480These watchers are stored in lists then need to be walked to find the
3481correct watcher to remove. The lists are usually short (you don't usually
3482have many watchers waiting for the same fd or signal).
3483
3484=item Finding the next timer in each loop iteration: O(1)
3485
3486By virtue of using a binary or 4-heap, the next timer is always found at a
3487fixed position in the storage array.
3488
3489=item Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)
3490
3491A change means an I/O watcher gets started or stopped, which requires
3492libev to recalculate its status (and possibly tell the kernel, depending
3493on backend and whether C<ev_io_set> was used).
3494
3495=item Activating one watcher (putting it into the pending state): O(1)
3496
3497=item Priority handling: O(number_of_priorities)
3498
3499Priorities are implemented by allocating some space for each
3500priority. When doing priority-based operations, libev usually has to
3501linearly search all the priorities, but starting/stopping and activating
3502watchers becomes O(1) with respect to priority handling.
3503
3504=item Sending an ev_async: O(1)
3505
3506=item Processing ev_async_send: O(number_of_async_watchers)
3507
3508=item Processing signals: O(max_signal_number)
3509
3510Sending involves a system call I<iff> there were no other C<ev_async_send>
3511calls in the current loop iteration. Checking for async and signal events
3512involves iterating over all running async watchers or all signal numbers.
3513
3514=back
3515 3450
3516 3451
3517=head1 PORTABILITY NOTES 3452=head1 PORTABILITY NOTES
3518 3453
3519=head2 WIN32 PLATFORM LIMITATIONS AND WORKAROUNDS 3454=head2 WIN32 PLATFORM LIMITATIONS AND WORKAROUNDS
3667=back 3602=back
3668 3603
3669If you know of other additional requirements drop me a note. 3604If you know of other additional requirements drop me a note.
3670 3605
3671 3606
3607=head1 ALGORITHMIC COMPLEXITIES
3608
3609In this section the complexities of (many of) the algorithms used inside
3610libev will be documented. For complexity discussions about backends see
3611the documentation for C<ev_default_init>.
3612
3613All of the following are about amortised time: If an array needs to be
3614extended, libev needs to realloc and move the whole array, but this
3615happens asymptotically rarer with higher number of elements, so O(1) might
3616mean that libev does a lengthy realloc operation in rare cases, but on
3617average it is much faster and asymptotically approaches constant time.
3618
3619=over 4
3620
3621=item Starting and stopping timer/periodic watchers: O(log skipped_other_timers)
3622
3623This means that, when you have a watcher that triggers in one hour and
3624there are 100 watchers that would trigger before that, then inserting will
3625have to skip roughly seven (C<ld 100>) of these watchers.
3626
3627=item Changing timer/periodic watchers (by autorepeat or calling again): O(log skipped_other_timers)
3628
3629That means that changing a timer costs less than removing/adding them,
3630as only the relative motion in the event queue has to be paid for.
3631
3632=item Starting io/check/prepare/idle/signal/child/fork/async watchers: O(1)
3633
3634These just add the watcher into an array or at the head of a list.
3635
3636=item Stopping check/prepare/idle/fork/async watchers: O(1)
3637
3638=item Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % EV_PID_HASHSIZE))
3639
3640These watchers are stored in lists, so they need to be walked to find the
3641correct watcher to remove. The lists are usually short (you don't usually
3642have many watchers waiting for the same fd or signal: one is typical, two
3643is rare).
3644
3645=item Finding the next timer in each loop iteration: O(1)
3646
3647By virtue of using a binary or 4-heap, the next timer is always found at a
3648fixed position in the storage array.
3649
3650=item Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)
3651
3652A change means an I/O watcher gets started or stopped, which requires
3653libev to recalculate its status (and possibly tell the kernel, depending
3654on backend and whether C<ev_io_set> was used).
3655
3656=item Activating one watcher (putting it into the pending state): O(1)
3657
3658=item Priority handling: O(number_of_priorities)
3659
3660Priorities are implemented by allocating some space for each
3661priority. When doing priority-based operations, libev usually has to
3662linearly search all the priorities, but starting/stopping and activating
3663watchers becomes O(1) with respect to priority handling.
3664
3665=item Sending an ev_async: O(1)
3666
3667=item Processing ev_async_send: O(number_of_async_watchers)
3668
3669=item Processing signals: O(max_signal_number)
3670
3671Sending involves a system call I<iff> there were no other C<ev_async_send>
3672calls in the current loop iteration. Checking for async and signal events
3673involves iterating over all running async watchers or all signal numbers.
3674
3675=back
3676
3677
3672=head1 AUTHOR 3678=head1 AUTHOR
3673 3679
3674Marc Lehmann <libev@schmorp.de>. 3680Marc Lehmann <libev@schmorp.de>.
3675 3681

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines