diff options
-rw-r--r-- | Changes | 4 | ||||
-rw-r--r-- | ev++.h | 3 | ||||
-rw-r--r-- | ev.c | 2 | ||||
-rw-r--r-- | ev.h | 2 | ||||
-rw-r--r-- | ev.pod | 25 |
5 files changed, 26 insertions, 10 deletions
@@ -3,6 +3,7 @@ Revision history for libev, a high-performance and full-featured event loop. TODO: ABI??? API????? Changes??? TODO: include ev_xyz_start in each example? TODO: section watcher states/lifetime +TODO: ALL ev_xxx_set funtions must be called from ev++ set methods, somehow. - "PORTING FROM LIBEV 3.X TO 4.X" (in ev.pod) is recommended reading. - ev_embed_stop did not correctly stop the watcher (very good testcase by Vladimir Timofeev). @@ -14,6 +15,9 @@ TODO: section watcher states/lifetime seems the former is *much* faster than the latter. - reduce the number of spurious wake-ups with the ports backend. - remove dependency on sys/queue.h on freebsd (patch by Vanilla Hsu). + - do async init within ev_async_start, not ev_async_set, which avoids + an API quirk where the set function must be called in the C++ API + even when there is nothing to set. - add (undocumented) EV_ENABLE when adding events with kqueue, this might help with OS X, which seems to need it despite documenting not to need it (helpfully pointed out by Tilghman Lesher). @@ -415,6 +415,7 @@ namespace ev { #if EV_MULTIPLICITY EV_PX; + // loop set void set (EV_P) throw () { this->EV_A = EV_A; @@ -783,8 +784,6 @@ namespace ev { #if EV_ASYNC_ENABLE EV_BEGIN_WATCHER (async, async) - void set () throw () { } - void send () throw () { ev_async_send (EV_A_ static_cast<ev_async *>(this)); @@ -3579,6 +3579,8 @@ ev_async_start (EV_P_ ev_async *w) if (expect_false (ev_is_active (w))) return; + w->sent = 0; + evpipe_init (EV_A); EV_FREQUENT_CHECK; @@ -642,7 +642,7 @@ void ev_resume (EV_P); #define ev_check_set(ev) /* nop, yes, this is a serious in-joke */ #define ev_embed_set(ev,other_) do { (ev)->other = (other_); } while (0) #define ev_fork_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_async_set(ev) do { (ev)->sent = 0; } while (0) +#define ev_async_set(ev) /* nop, yes, this is a serious in-joke */ #define ev_io_init(ev,cb,fd,events) do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } while (0) #define ev_timer_init(ev,cb,after,repeat) do { ev_init ((ev), (cb)); ev_timer_set ((ev),(after),(repeat)); } while (0) @@ -3393,16 +3393,22 @@ do this when the watcher is inactive (and not pending either). =item w->set ([arguments]) -Basically the same as C<ev_TYPE_set>, with the same arguments. Must be -called at least once. Unlike the C counterpart, an active watcher gets -automatically stopped and restarted when reconfiguring it with this -method. +Basically the same as C<ev_TYPE_set>, with the same arguments. Either this +method or a suitable start method must be called at least once. Unlike the +C counterpart, an active watcher gets automatically stopped and restarted +when reconfiguring it with this method. =item w->start () Starts the watcher. Note that there is no C<loop> argument, as the constructor already stores the event loop. +=item w->start ([arguments]) + +Instead of calling C<set> and C<start> methods separately, it is often +convenient to wrap them in one call. Uses the same type of arguments as +the configure C<set> method of the watcher. + =item w->stop () Stops the watcher if it is active. Again, no C<loop> argument. @@ -3424,20 +3430,25 @@ Invokes C<ev_stat_stat>. =back -Example: Define a class with an IO and idle watcher, start one of them in -the constructor. +Example: Define a class with two I/O and idle watchers, start the I/O +watchers in the constructor. class myclass { ev::io io ; void io_cb (ev::io &w, int revents); + ev::io2 io2 ; void io2_cb (ev::io &w, int revents); ev::idle idle; void idle_cb (ev::idle &w, int revents); myclass (int fd) { io .set <myclass, &myclass::io_cb > (this); + io2 .set <myclass, &myclass::io2_cb > (this); idle.set <myclass, &myclass::idle_cb> (this); - io.start (fd, ev::READ); + io.set (fd, ev::WRITE); // configure the watcher + io.start (); // start it whenever convenient + + io2.start (fd, ev::READ); // set + start in one call } }; |