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] |