summaryrefslogtreecommitdiff
path: root/ev.pod
diff options
context:
space:
mode:
Diffstat (limited to 'ev.pod')
-rw-r--r--ev.pod191
1 files changed, 183 insertions, 8 deletions
diff --git a/ev.pod b/ev.pod
index 3f4a064..cc478bd 100644
--- a/ev.pod
+++ b/ev.pod
@@ -547,6 +547,10 @@ The signal specified in the C<ev_signal> watcher has been received by a thread.
The pid specified in the C<ev_child> watcher has received a status change.
+=item C<EV_STAT>
+
+The path specified in the C<ev_stat> watcher changed its attributes somehow.
+
=item C<EV_IDLE>
The C<ev_idle> watcher has determined that you have nothing better to do.
@@ -691,7 +695,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<ev_io> - is this file descriptor readable or writable?
@@ -744,6 +758,14 @@ Configures an C<ev_io> watcher. The C<fd> is the file descriptor to
rceeive events for and events is either C<EV_READ>, C<EV_WRITE> or
C<EV_READ | EV_WRITE> 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<stdin_readable_cb> when STDIN_FILENO has become, well
@@ -816,13 +838,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<ev_timer> 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<ev_timer> with C<after>=C<repeat>=C<60> and calling
+C<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.
+
+You can also ignore the C<after> value and C<ev_timer_start> altogether
+and only ever use the C<repeat> 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<repeat> value. Will be used each time the watcher times out
+or C<ev_timer_again> is called and determines the next timeout (if any),
+which is also when any modifications are taken into account.
=back
@@ -959,6 +1003,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<ev_periodic_again> 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<ev_periodic_again> is being called.
+
=back
Example: call a callback every hour, or, more precisely, whenever the
@@ -1018,6 +1074,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<SIGxxx> constants).
+=item int signum [read-only]
+
+The signal the watcher watches out for.
+
=back
@@ -1039,6 +1099,19 @@ the status word (use the macros from C<sys/wait.h> and see your systems
C<waitpid> documentation). The C<rpid> 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<rpid> (see your systems
+C<waitpid> and C<sys/wait.h> documentation for details).
+
=back
Example: try to exit cleanly on SIGINT and SIGTERM.
@@ -1054,6 +1127,104 @@ Example: try to exit cleanly on SIGINT and SIGTERM.
ev_signal_start (loop, &sigint_cb);
+=head2 C<ev_stat> - did the file attributes just change?
+
+This watches a filesystem path for attribute changes. That is, it calls
+C<stat> 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<st_nlink> 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<stat (2)> 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<suitable,
+unspecified default> 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<path>. The C<interval> 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<path> must point to the same
+path for as long as the watcher is active.
+
+The callback will be receive C<EV_STAT> 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<ev_statdata>, this is usually the (or one of the) C<struct stat> types
+suitable for your system. If the C<st_nlink> member is C<0>, then there
+was some error while C<stat>ing the file.
+
+=item ev_statdata prev [read-only]
+
+The previous attributes of the file. The callback gets invoked whenever
+C<prev> != C<attr>.
+
+=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</etc/passwd> 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<ev_idle> - when you've got nothing better to do...
Idle watchers trigger events when there are no other events are pending
@@ -1294,6 +1465,10 @@ Make a single, non-blocking sweep over the embedded loop. This works
similarly to C<ev_loop (embedded_loop, EVLOOP_NONBLOCK)>, but in the most
apropriate way for embedded loops.
+=item struct ev_loop *loop [read-only]
+
+The embedded event loop.
+
=back