diff options
| -rw-r--r-- | Changes | 3 | ||||
| -rw-r--r-- | Makefile.am | 2 | ||||
| -rw-r--r-- | ev++.h | 16 | ||||
| -rw-r--r-- | ev.c | 22 | ||||
| -rw-r--r-- | ev.h | 7 | ||||
| -rw-r--r-- | ev.pod | 8 | 
6 files changed, 36 insertions, 22 deletions
| @@ -1,8 +1,11 @@  Revision history for libev, a high-performance and full-featured event loop +	- API/ABI bump to version 3.0.  	- ev++.h includes "ev.h" by default now, not <ev.h>.  	- slightly improved documentation.  	- speed up signal detection after a fork. +        - only optionally return trace status changed in ev_child +          watchers.  2.01 Tue Dec 25 08:04:41 CET 2007  	- separate Changes file. diff --git a/Makefile.am b/Makefile.am index 4f576a3..9a8239e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,6 @@  AUTOMAKE_OPTIONS = foreign no-dependencies -VERSION_INFO = 2:0 +VERSION_INFO = 3:0  EXTRA_DIST = LICENSE Changes libev.m4 autogen.sh \  	     ev_vars.h ev_wrap.h \ @@ -159,22 +159,22 @@ namespace ev {      }  #if EV_MULTIPLICITY -    bool operator== (struct ev_loop *other) const throw () +    bool operator == (struct ev_loop *other) const throw ()      {        return this->EV_AX == other;      } -    bool operator!= (struct ev_loop *other) const throw () +    bool operator != (struct ev_loop *other) const throw ()      {        return ! (*this == other);      } -    bool operator== (const struct ev_loop *other) const throw () +    bool operator == (const struct ev_loop *other) const throw ()      {        return this->EV_AX == other;      } -    bool operator!= (const struct ev_loop *other) const throw () +    bool operator != (const struct ev_loop *other) const throw ()      {        return (*this == other);      } @@ -697,17 +697,17 @@ namespace ev {    EV_END_WATCHER (sig, signal)    EV_BEGIN_WATCHER (child, child) -    void set (int pid) throw () +    void set (int pid, int trace = 0) throw ()      {        int active = is_active ();        if (active) stop (); -      ev_child_set (static_cast<ev_child *>(this), pid); +      ev_child_set (static_cast<ev_child *>(this), pid, trace);        if (active) start ();      } -    void start (int pid) throw () +    void start (int pid, int trace = 0) throw ()      { -      set (pid); +      set (pid, trace);        start ();      }    EV_END_WATCHER (child, child) @@ -869,19 +869,27 @@ static WL childs [EV_PID_HASHSIZE];  static ev_signal childev; +#ifndef WIFCONTINUED +# define WIFCONTINUED(status) 0 +#endif +  void inline_speed  child_reap (EV_P_ ev_signal *sw, int chain, int pid, int status)  {    ev_child *w; +  int traced = WIFSTOPPED (status) || WIFCONTINUED (status);    for (w = (ev_child *)childs [chain & (EV_PID_HASHSIZE - 1)]; w; w = (ev_child *)((WL)w)->next) -    if (w->pid == pid || !w->pid) -      { -        ev_set_priority (w, ev_priority (sw)); /* need to do it *now* */ -        w->rpid    = pid; -        w->rstatus = status; -        ev_feed_event (EV_A_ (W)w, EV_CHILD); -      } +    { +      if ((w->pid == pid || !w->pid) +          && (!traced || (w->flags & 1))) +        { +          ev_set_priority (w, ev_priority (sw)); /* need to do it *now* */ +          w->rpid    = pid; +          w->rstatus = status; +          ev_feed_event (EV_A_ (W)w, EV_CHILD); +        } +    }  }  #ifndef WCONTINUED @@ -130,7 +130,7 @@ struct ev_loop;  # define EV_PROTOTYPES 1  #endif -#define EV_VERSION_MAJOR 2 +#define EV_VERSION_MAJOR 3  #define EV_VERSION_MINOR 0  #ifndef EV_CB_DECLARE @@ -227,6 +227,7 @@ typedef struct ev_child  {    EV_WATCHER_LIST (ev_child) +  int flags;   /* private */    int pid;     /* ro */    int rpid;    /* rw, holds the received pid */    int rstatus; /* rw, holds the exit status, use the macros from sys/wait.h */ @@ -457,7 +458,7 @@ void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revent  #define ev_timer_set(ev,after_,repeat_)     do { (ev)->at = (after_); (ev)->repeat = (repeat_); } while (0)  #define ev_periodic_set(ev,ofs_,ival_,res_) do { (ev)->offset = (ofs_); (ev)->interval = (ival_); (ev)->reschedule_cb= (res_); } while (0)  #define ev_signal_set(ev,signum_)           do { (ev)->signum = (signum_); } while (0) -#define ev_child_set(ev,pid_)               do { (ev)->pid = (pid_); } while (0) +#define ev_child_set(ev,pid_,trace_)        do { (ev)->pid = (pid_); (ev)->flags = !!(trace_); } while (0)  #define ev_stat_set(ev,path_,interval_)     do { (ev)->path = (path_); (ev)->interval = (interval_); (ev)->wd = -2; } while (0)  #define ev_idle_set(ev)                     /* nop, yes, this is a serious in-joke */  #define ev_prepare_set(ev)                  /* nop, yes, this is a serious in-joke */ @@ -469,7 +470,7 @@ void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revent  #define ev_timer_init(ev,cb,after,repeat)   do { ev_init ((ev), (cb)); ev_timer_set ((ev),(after),(repeat)); } while (0)  #define ev_periodic_init(ev,cb,at,ival,res) do { ev_init ((ev), (cb)); ev_periodic_set ((ev),(at),(ival),(res)); } while (0)  #define ev_signal_init(ev,cb,signum)        do { ev_init ((ev), (cb)); ev_signal_set ((ev), (signum)); } while (0) -#define ev_child_init(ev,cb,pid)            do { ev_init ((ev), (cb)); ev_child_set ((ev),(pid)); } while (0) +#define ev_child_init(ev,cb,pid,trace)      do { ev_init ((ev), (cb)); ev_child_set ((ev),(pid),(trace)); } while (0)  #define ev_stat_init(ev,cb,path,interval)   do { ev_init ((ev), (cb)); ev_stat_set ((ev),(path),(interval)); } while (0)  #define ev_idle_init(ev,cb)                 do { ev_init ((ev), (cb)); ev_idle_set ((ev)); } while (0)  #define ev_prepare_init(ev,cb)              do { ev_init ((ev), (cb)); ev_prepare_set ((ev)); } while (0) @@ -1440,16 +1440,18 @@ some child status changes (most typically when a child of yours dies).  =over 4 -=item ev_child_init (ev_child *, callback, int pid) +=item ev_child_init (ev_child *, callback, int pid, int trace) -=item ev_child_set (ev_child *, int pid) +=item ev_child_set (ev_child *, int pid, int trace)  Configures the watcher to wait for status changes of process C<pid> (or  I<any> process if C<pid> is specified as C<0>). The callback can look  at the C<rstatus> member of the C<ev_child> watcher structure to see  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. +process causing the status change. C<trace> must be either C<0> (only +activate the watcher when the process terminates) or C<1> (additionally +activate the watcher when the process is stopped or continued).  =item int pid [read-only] | 
