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       }     }; | 
