--- cvsroot/EV/EV.xs 2009/07/14 20:34:58 1.129 +++ cvsroot/EV/EV.xs 2009/07/19 21:59:55 1.132 @@ -66,15 +66,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; @@ -431,6 +454,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; @@ -608,7 +632,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 +893,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 +910,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 +923,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 +948,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 +1350,6 @@ OUTPUT: RETVAL -#if 0 - ev_signal *signal (struct ev_loop *loop, SV *signal, SV *cb) ALIAS: signal_ns = 1 @@ -1335,13 +1360,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