X-Git-Url: https://git.llucax.com/software/libev.git/blobdiff_plain/b7e58d7ed7f85d7cb7fe1c34cfe3fa2484a6dc31..52b9969b0f7befd5965ad9826d9942897fc4dbce:/ev.pod?ds=sidebyside diff --git a/ev.pod b/ev.pod index 3f4a064..17484ff 100644 --- a/ev.pod +++ b/ev.pod @@ -50,7 +50,6 @@ called C, which is what you should use too. It usually aliases to the C type in C, and when you need to do any calculations on it, you should treat it as such. - =head1 GLOBAL FUNCTIONS These functions can be called anytime, even before initialising the @@ -547,6 +546,10 @@ The signal specified in the C watcher has been received by a thread. The pid specified in the C watcher has received a status change. +=item C + +The path specified in the C watcher changed its attributes somehow. + =item C The C watcher has determined that you have nothing better to do. @@ -563,6 +566,15 @@ many watchers as they want, and all of them will be taken into account (for example, a C watcher might start an idle watcher to keep C from blocking). +=item C + +The embedded event loop specified in the C watcher needs attention. + +=item C + +The event loop has been resumed in the child process after fork (see +C). + =item C An unspecified error has occured, the watcher has been stopped. This might @@ -691,7 +703,17 @@ have been omitted.... =head1 WATCHER TYPES This section describes each watcher in detail, but will not repeat -information given in the last section. +information given in the last section. Any initialisation/set macros, +functions and members specific to the watcher type are explained. + +Members are additionally marked with either I<[read-only]>, meaning that, +while the watcher is active, you can look at the member and expect some +sensible content, but you must not modify it (you can modify it while the +watcher is stopped to your hearts content), or I<[read-write]>, which +means you can expect it to have some sensible content while the watcher +is active, but you can also modify it. Modifying it may not do something +sensible or take immediate effect (or do anything at all), but libev will +not crash or malfunction in any way. =head2 C - is this file descriptor readable or writable? @@ -744,6 +766,14 @@ Configures an C watcher. The C is the file descriptor to rceeive events for and events is either C, C or C to receive the given events. +=item int fd [read-only] + +The file descriptor being watched. + +=item int events [read-only] + +The events being watched. + =back Example: call C when STDIN_FILENO has become, well @@ -816,13 +846,35 @@ If the timer is repeating, either start it if necessary (with the repeat value), or reset the running timer to the repeat value. This sounds a bit complicated, but here is a useful and typical -example: Imagine you have a tcp connection and you want a so-called idle -timeout, that is, you want to be called when there have been, say, 60 -seconds of inactivity on the socket. The easiest way to do this is to -configure an C with after=repeat=60 and calling ev_timer_again each -time you successfully read or write some data. If you go into an idle -state where you do not expect data to travel on the socket, you can stop -the timer, and again will automatically restart it if need be. +example: Imagine you have a tcp connection and you want a so-called +idle timeout, that is, you want to be called when there have been, +say, 60 seconds of inactivity on the socket. The easiest way to do +this is to configure an C with C=C=C<60> and calling +C each time you successfully read or write some data. If +you go into an idle state where you do not expect data to travel on the +socket, you can stop the timer, and again will automatically restart it if +need be. + +You can also ignore the C value and C altogether +and only ever use the C value: + + ev_timer_init (timer, callback, 0., 5.); + ev_timer_again (loop, timer); + ... + timer->again = 17.; + ev_timer_again (loop, timer); + ... + timer->again = 10.; + ev_timer_again (loop, timer); + +This is more efficient then stopping/starting the timer eahc time you want +to modify its timeout value. + +=item ev_tstamp repeat [read-write] + +The current C value. Will be used each time the watcher times out +or C is called and determines the next timeout (if any), +which is also when any modifications are taken into account. =back @@ -959,6 +1011,18 @@ when you changed some parameters or the reschedule callback would return a different time than the last time it was called (e.g. in a crond like program when the crontabs have changed). +=item ev_tstamp interval [read-write] + +The current interval value. Can be modified any time, but changes only +take effect when the periodic timer fires or C is being +called. + +=item ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now) [read-write] + +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 is being called. + =back Example: call a callback every hour, or, more precisely, whenever the @@ -1018,6 +1082,10 @@ SIG_DFL (regardless of what it was set to before). Configures the watcher to trigger on the given signal number (usually one of the C constants). +=item int signum [read-only] + +The signal the watcher watches out for. + =back @@ -1039,6 +1107,19 @@ the status word (use the macros from C and see your systems C documentation). The C member contains the pid of the process causing the status change. +=item int pid [read-only] + +The process id this watcher watches out for, or C<0>, meaning any process id. + +=item int rpid [read-write] + +The process id that detected a status change. + +=item int rstatus [read-write] + +The process exit/trace status caused by C (see your systems +C and C documentation for details). + =back Example: try to exit cleanly on SIGINT and SIGTERM. @@ -1054,6 +1135,104 @@ Example: try to exit cleanly on SIGINT and SIGTERM. ev_signal_start (loop, &sigint_cb); +=head2 C - did the file attributes just change? + +This watches a filesystem path for attribute changes. That is, it calls +C regularly (or when the OS says it changed) and sees if it changed +compared to the last time, invoking the callback if it did. + +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 exist" is signified by the C field being zero (which is +otherwise always forced to be at least one) and all the other fields of +the stat buffer having unspecified contents. + +Since there is no standard to do this, the portable implementation simply +calls C regulalry on the path to see if it changed somehow. You +can specify a recommended polling interval for this case. If you specify +a polling interval of C<0> (highly recommended!) then a I value will be used (which you can expect to be around +five seconds, although this might change dynamically). Libev will also +impose a minimum interval which is currently around C<0.1>, but thats +usually overkill. + +This watcher type is not meant for massive numbers of stat watchers, +as even with OS-supported change notifications, this can be +resource-intensive. + +At the time of this writing, no specific OS backends are implemented, but +if demand increases, at least a kqueue and inotify backend will be added. + +=over 4 + +=item ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval) + +=item ev_stat_set (ev_stat *, const char *path, ev_tstamp interval) + +Configures the watcher to wait for status changes of the given +C. The C is a hint on how quickly a change is expected to +be detected and should normally be specified as C<0> to let libev choose +a suitable value. The memory pointed to by C must point to the same +path for as long as the watcher is active. + +The callback will be receive C when a change was detected, +relative to the attributes at the time the watcher was started (or the +last change was detected). + +=item ev_stat_stat (ev_stat *) + +Updates the stat buffer immediately with new values. If you change the +watched path in your callback, you could call this fucntion to avoid +detecting this change (while introducing a race condition). Can also be +useful simply to find out the new values. + +=item ev_statdata attr [read-only] + +The most-recently detected attributes of the file. Although the type is of +C, this is usually the (or one of the) C types +suitable for your system. If the C member is C<0>, then there +was some error while Cing the file. + +=item ev_statdata prev [read-only] + +The previous attributes of the file. The callback gets invoked whenever +C != C. + +=item ev_tstamp interval [read-only] + +The specified interval. + +=item const char *path [read-only] + +The filesystem path that is being watched. + +=back + +Example: Watch C for attribute changes. + + static void + passwd_cb (struct ev_loop *loop, ev_stat *w, int revents) + { + /* /etc/passwd changed in some way */ + if (w->attr.st_nlink) + { + printf ("passwd current size %ld\n", (long)w->attr.st_size); + printf ("passwd current atime %ld\n", (long)w->attr.st_mtime); + printf ("passwd current mtime %ld\n", (long)w->attr.st_mtime); + } + else + /* you shalt not abuse printf for puts */ + puts ("wow, /etc/passwd is not there, expect problems. " + "if this is windows, they already arrived\n"); + } + + ... + ev_stat passwd; + + ev_stat_init (&passwd, passwd_cb, "/etc/passwd"); + ev_stat_start (loop, &passwd); + + =head2 C - when you've got nothing better to do... Idle watchers trigger events when there are no other events are pending @@ -1294,6 +1473,31 @@ Make a single, non-blocking sweep over the embedded loop. This works similarly to C, but in the most apropriate way for embedded loops. +=item struct ev_loop *loop [read-only] + +The embedded event loop. + +=back + + +=head2 C - the audacity to resume the event loop after a fork + +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. + +=over 4 + +=item ev_fork_init (ev_signal *, callback) + +Initialises and configures the fork watcher - it has no parameters of any +kind. There is a C macro, but using it is utterly pointless, +believe me. + =back @@ -1465,6 +1669,10 @@ C function. Invokes C. +=item w->update () C only + +Invokes C. + =back =back @@ -1487,6 +1695,68 @@ the constructor. io.start (fd, ev::READ); } + +=head1 MACRO MAGIC + +Libev can be compiled with a variety of options, the most fundemantal is +C. This option determines wether (most) functions and +callbacks have an initial C argument. + +To make it easier to write programs that cope with either variant, the +following macros are defined: + +=over 4 + +=item C, C + +This provides the loop I for functions, if one is required ("ev +loop argument"). The C form is used when this is the sole argument, +C is used when other arguments are following. Example: + + ev_unref (EV_A); + ev_timer_add (EV_A_ watcher); + ev_loop (EV_A_ 0); + +It assumes the variable C of type C is in scope, +which is often provided by the following macro. + +=item C, C + +This provides the loop I for functions, if one is required ("ev +loop parameter"). The C form is used when this is the sole parameter, +C is used when other parameters are following. Example: + + // this is how ev_unref is being declared + static void ev_unref (EV_P); + + // this is how you can declare your typical callback + static void cb (EV_P_ ev_timer *w, int revents) + +It declares a parameter C of type C, quite +suitable for use with C. + +=item C, C + +Similar to the other two macros, this gives you the value of the default +loop, if multiple loops are supported ("ev loop default"). + +=back + +Example: Declare and initialise a check watcher, working regardless of +wether multiple loops are supported or not. + + static void + check_cb (EV_P_ ev_timer *w, int revents) + { + ev_check_stop (EV_A_ w); + } + + ev_check check; + ev_check_init (&check, check_cb); + ev_check_start (EV_DEFAULT_ &check); + ev_loop (EV_DEFAULT_ 0); + + =head1 EMBEDDING Libev can (and often is) directly embedded into host @@ -1718,6 +1988,11 @@ defined to be C<0>, then they are not. If undefined or defined to be C<1>, then stat watchers are supported. If defined to be C<0>, then they are not. +=item EV_FORK_ENABLE + +If undefined or defined to be C<1>, then fork watchers are supported. If +defined to be C<0>, then they are not. + =item EV_MINIMAL If you need to shave off some kilobytes of code at the expense of some