diff options
-rw-r--r-- | Changes | 5 | ||||
-rw-r--r-- | ev.c | 8 | ||||
-rw-r--r-- | ev.pod | 15 |
3 files changed, 19 insertions, 9 deletions
@@ -1,7 +1,10 @@ Revision history for libev, a high-performance and full-featured event loop. WISH? monotonic clocks times/GetTickCount for coarse corrections? -TODO: make ev_once timeout=0 useful, and make I/O always win. + + - ev_once now passes both timeout and io to the callback if both + occur concurrently, instead of giving timeouts precedence. + 3.44 Mon Sep 29 05:18:39 CEST 2008 - embed watchers now automatically invoke ev_loop_fork on the embedded loop when the parent loop forks. @@ -3014,13 +3014,17 @@ once_cb (EV_P_ struct ev_once *once, int revents) static void once_cb_io (EV_P_ ev_io *w, int revents) { - once_cb (EV_A_ (struct ev_once *)(((char *)w) - offsetof (struct ev_once, io)), revents); + struct ev_once *once = (struct ev_once *)(((char *)w) - offsetof (struct ev_once, io)); + + once_cb (EV_A_ once, revents | ev_clear_pending (EV_A_ &once->to)); } static void once_cb_to (EV_P_ ev_timer *w, int revents) { - once_cb (EV_A_ (struct ev_once *)(((char *)w) - offsetof (struct ev_once, to)), revents); + struct ev_once *once = (struct ev_once *)(((char *)w) - offsetof (struct ev_once, to)); + + once_cb (EV_A_ once, revents | ev_clear_pending (EV_A_ &once->io)); } void @@ -2515,20 +2515,23 @@ the given C<fd> and C<events> set will be created and started. If C<timeout> is less than 0, then no timeout watcher will be started. Otherwise an C<ev_timer> watcher with after = C<timeout> (and -repeat = 0) will be started. While C<0> is a valid timeout, it is of -dubious value. +repeat = 0) will be started. C<0> is a valid timeout. The callback has the type C<void (*cb)(int revents, void *arg)> and gets passed an C<revents> set like normal event callbacks (a combination of C<EV_ERROR>, C<EV_READ>, C<EV_WRITE> or C<EV_TIMEOUT>) and the C<arg> -value passed to C<ev_once>: +value passed to C<ev_once>. Note that it is possible to receive I<both> +a timeout and an io event at the same time - you probably should give io +events precedence. + +Example: wait up to ten seconds for data to appear on STDIN_FILENO. static void stdin_ready (int revents, void *arg) { - if (revents & EV_TIMEOUT) - /* doh, nothing entered */; - else if (revents & EV_READ) + if (revents & EV_READ) /* stdin might have data for us, joy! */; + else if (revents & EV_TIMEOUT) + /* doh, nothing entered */; } ev_once (STDIN_FILENO, EV_READ, 10., stdin_ready, 0); |