--- libev/ev.pod 2007/11/26 19:49:36 1.47 +++ libev/ev.pod 2007/11/27 08:11:52 1.48 @@ -547,6 +547,10 @@ 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. @@ -691,7 +695,17 @@ =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 +758,14 @@ 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 +838,35 @@ 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 +1003,18 @@ 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 +1074,10 @@ 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 +1099,19 @@ 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 +1127,104 @@ 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 +1465,10 @@ similarly to C, but in the most apropriate way for embedded loops. +=item struct ev_loop *loop [read-only] + +The embedded event loop. + =back