--- libev/ev.html 2007/11/26 10:20:43 1.47 +++ libev/ev.html 2007/11/27 08:11:52 1.48 @@ -6,7 +6,7 @@ - +
@@ -33,6 +33,7 @@ev_periodic
- to cron or not to cron?ev_signal
- signal me when a signal gets signalled!ev_child
- watch out for process status changesev_stat
- did the file attributes just change?ev_idle
- when you've got nothing better to do...ev_prepare
and ev_check
- customise your event loop!ev_embed
- when one backend isn't enough...The pid specified in the ev_child
watcher has received a status change.
EV_STAT
The path specified in the ev_stat
watcher changed its attributes somehow.
EV_IDLE
The ev_idle
watcher has determined that you have nothing better to do.
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 [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 [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.
@@ -783,6 +797,14 @@ rceeive events for and events is eitherEV_READ
, EV_WRITE
or
EV_READ | EV_WRITE
to receive the given events.
+ The file descriptor being watched.
+The events being watched.
+Example: call stdin_readable_cb
when STDIN_FILENO has become, well
readable, but only once. Since it is likely line-buffered, you could
@@ -849,13 +871,34 @@
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 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.
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.
+ You can also ignore the after
value and ev_timer_start
altogether
+and only ever use the 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.
+ +The current repeat
value. Will be used each time the watcher times out
+or ev_timer_again
is called and determines the next timeout (if any),
+which is also when any modifications are taken into account.
Example: create a timer that fires after 60 seconds.
@@ -983,6 +1026,18 @@ a different time than the last time it was called (e.g. in a crond like program when the crontabs have changed). +The current interval value. Can be modified any time, but changes only
+take effect when the periodic timer fires or ev_periodic_again
is being
+called.
The current reschedule callback, or 0
, if this functionality is
+switched off. Can be changed any time, but changes only take effect when
+the periodic timer fires or ev_periodic_again
is being called.
Example: call a callback every hour, or, more precisely, whenever the system clock is divisible by 3600. The callback invocation times have @@ -1041,6 +1096,10 @@
Configures the watcher to trigger on the given signal number (usually one
of the SIGxxx
constants).
The signal the watcher watches out for.
+waitpid
documentation). The rpid
member contains the pid of the
process causing the status change.
+ The process id this watcher watches out for, or 0
, meaning any process id.
The process id that detected a status change.
+The process exit/trace status caused by rpid
(see your systems
+waitpid
and sys/wait.h
documentation for details).
Example: try to exit cleanly on SIGINT and SIGTERM.
static void @@ -1081,6 +1153,99 @@
ev_stat
- did the file attributes just change?This watches a filesystem path for attribute changes. That is, it calls
+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 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 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 0
(highly recommended!) then a 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 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.
+Configures the watcher to wait for status changes of the given
+path
. The interval
is a hint on how quickly a change is expected to
+be detected and should normally be specified as 0
to let libev choose
+a suitable value. The memory pointed to by path
must point to the same
+path for as long as the watcher is active.
The callback will be receive EV_STAT
when a change was detected,
+relative to the attributes at the time the watcher was started (or the
+last change was detected).
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.
+The most-recently detected attributes of the file. Although the type is of
+ev_statdata
, this is usually the (or one of the) struct stat
types
+suitable for your system. If the st_nlink
member is 0
, then there
+was some error while stat
ing the file.
The previous attributes of the file. The callback gets invoked whenever
+prev
!= attr
.
The specified interval.
+The filesystem path that is being watched.
+Example: Watch /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); + + + + ++ +
ev_idle
- when you've got nothing better to do...Idle watchers trigger events when there are no other events are pending
@@ -1306,6 +1471,10 @@
similarly to ev_loop (embedded_loop, EVLOOP_NONBLOCK)
, but in the most
apropriate way for embedded loops.
The embedded event loop.
+If undefined or defined to be 1
, then periodic timers are supported. If
+defined to be 0
, then they are not. Disabling them saves a few kB of
+code.
If undefined or defined to be 1
, then embed watchers are supported. If
+defined to be 0
, then they are not.
If undefined or defined to be 1
, then stat watchers are supported. If
+defined to be 0
, then they are not.
If undefined or defined to be 1
, then periodic timers are supported,
-otherwise not. This saves a few kb of code.
If you need to shave off some kilobytes of code at the expense of some
+speed, define this symbol to 1
. Currently only used for gcc to override
+some inlining decisions, saves roughly 30% codesize of amd64.