--- cvsroot/EV/EV.xs 2009/07/14 20:34:58 1.129 +++ cvsroot/EV/EV.xs 2010/03/16 17:11:48 1.136 @@ -15,9 +15,11 @@ return s_fileno (fh, 0); } +#define EV_STANDALONE 1 #define EV_PROTOTYPES 1 #define EV_USE_NANOSLEEP EV_USE_MONOTONIC #define EV_H +#define EV_CONFIG_H error #include "EV/EVAPI.h" #define EV_SELECT_IS_WINSOCKET 0 @@ -66,15 +68,38 @@ } while (0) #define RESET(type,w,seta) \ - do { \ - int active = ev_is_active (w); \ - if (active) STOP (type, w); \ - ev_ ## type ## _set seta; \ - if (active) START (type, w); \ - } while (0) + do { \ + int active = ev_is_active (w); \ + if (active) STOP (type, w); \ + ev_ ## type ## _set seta; \ + if (active) START (type, w); \ + } while (0) typedef int Signal; +/* horrible... */ +#define CHECK_SIGNAL_CAN_START(w) \ + do { \ + /* dive into the internals of libev to avoid aborting in libev */ \ + if (signals [(w)->signum - 1].loop \ + && signals [(w)->signum - 1].loop != e_loop (w)) \ + croak ("unable to start signal watcher, signal %d already registered in another loop", w->signum); \ + } while (0) + +#define START_SIGNAL(w) \ + do { \ + CHECK_SIGNAL_CAN_START (w); \ + START (signal, w); \ + } while (0) \ + +#define RESET_SIGNAL(w,seta) \ + do { \ + int active = ev_is_active (w); \ + if (active) STOP (signal, w); \ + ev_ ## signal ## _set seta; \ + if (active) START_SIGNAL (w); \ + } while (0) + static SV *default_loop_sv; static struct EVAPI evapi; @@ -337,7 +362,7 @@ const_iv (EV_, READ) const_iv (EV_, WRITE) const_iv (EV_, IO) - const_iv (EV_, TIMEOUT) + const_iv (EV_, TIMEOUT) /* deprecated */ const_iv (EV_, TIMER) const_iv (EV_, PERIODIC) const_iv (EV_, SIGNAL) @@ -365,9 +390,13 @@ const_iv (EV, BACKEND_KQUEUE) const_iv (EV, BACKEND_DEVPOLL) const_iv (EV, BACKEND_PORT) + const_iv (EV, BACKEND_ALL) const_iv (EV, FLAG_AUTO) - const_iv (EV, FLAG_NOENV) const_iv (EV, FLAG_FORKCHECK) + const_iv (EV, FLAG_SIGNALFD) + const_iv (EV, FLAG_NOENV) + const_iv (EV, FLAG_NOSIGFD) /* compatibility, always 0 */ + const_iv (EV, FLAG_NOINOTIFY) const_iv (EV_, VERSION_MAJOR) const_iv (EV_, VERSION_MINOR) @@ -431,6 +460,7 @@ evapi.timer_start = ev_timer_start; evapi.timer_stop = ev_timer_stop; evapi.timer_again = ev_timer_again; + evapi.timer_remaining = ev_timer_remaining; evapi.periodic_start = ev_periodic_start; evapi.periodic_stop = ev_periodic_stop; evapi.signal_start = ev_signal_start; @@ -556,11 +586,18 @@ ev_io *io (SV *fh, int events, SV *cb) ALIAS: io_ns = 1 + _ae_io = 2 CODE: { int fd = s_fileno (fh, events & EV_WRITE); CHECK_FD (fh, fd); + if (ix == 2) + { + ix = 0; + events = events ? EV_WRITE : EV_READ; + } + RETVAL = e_new (sizeof (ev_io), cb, default_loop_sv); RETVAL->fh = newSVsv (fh); ev_io_set (RETVAL, fd, events); @@ -608,7 +645,7 @@ RETVAL = e_new (sizeof (ev_signal), cb, default_loop_sv); ev_signal_set (RETVAL, signum); - if (!ix) START (signal, RETVAL); + if (!ix) START_SIGNAL (RETVAL); } OUTPUT: RETVAL @@ -869,7 +906,7 @@ void ev_signal_start (ev_signal *w) CODE: - START (signal, w); + START_SIGNAL (w); void ev_signal_stop (ev_signal *w) CODE: @@ -886,7 +923,7 @@ Signal signum = s_signum (signal); CHECK_SIG (signal, signum); - RESET (signal, w, (w, signum)); + RESET_SIGNAL (w, (w, signum)); } int signal (ev_signal *w, SV *new_signal = 0) @@ -899,7 +936,7 @@ Signal signum = s_signum (new_signal); CHECK_SIG (new_signal, signum); - RESET (signal, w, (w, signum)); + RESET_SIGNAL (w, (w, signum)); } } OUTPUT: @@ -924,6 +961,9 @@ ev_timer_again (e_loop (w), w); UNREF (w); +NV ev_timer_remaining (ev_timer *w) + C_ARGS: e_loop (w), w + void DESTROY (ev_timer *w) CODE: STOP (timer, w); @@ -1323,8 +1363,6 @@ OUTPUT: RETVAL -#if 0 - ev_signal *signal (struct ev_loop *loop, SV *signal, SV *cb) ALIAS: signal_ns = 1 @@ -1335,13 +1373,11 @@ RETVAL = e_new (sizeof (ev_signal), cb, ST (0)); ev_signal_set (RETVAL, signum); - if (!ix) START (signal, RETVAL); + if (!ix) START_SIGNAL (RETVAL); } OUTPUT: RETVAL -#endif - ev_idle *idle (struct ev_loop *loop, SV *cb) ALIAS: idle_ns = 1