--- cvsroot/EV/EV.xs 2009/07/14 02:33:55 1.127 +++ cvsroot/EV/EV.xs 2009/12/31 06:59:47 1.135 @@ -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; @@ -365,9 +388,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) @@ -419,6 +446,7 @@ evapi.backend = ev_backend; evapi.unloop = ev_unloop; evapi.invoke_pending = ev_invoke_pending; + evapi.pending_count = ev_pending_count; evapi.set_loop_release_cb = ev_set_loop_release_cb; evapi.set_invoke_pending_cb= ev_set_invoke_pending_cb; evapi.ref = ev_ref; @@ -430,6 +458,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; @@ -546,14 +575,27 @@ ev_feed_signal_event (evapi.default_loop, signum); } +unsigned int ev_pending_count () + C_ARGS: evapi.default_loop + +void ev_invoke_pending () + C_ARGS: evapi.default_loop + 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); @@ -601,7 +643,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 @@ -862,7 +904,7 @@ void ev_signal_start (ev_signal *w) CODE: - START (signal, w); + START_SIGNAL (w); void ev_signal_stop (ev_signal *w) CODE: @@ -879,7 +921,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) @@ -892,7 +934,7 @@ Signal signum = s_signum (new_signal); CHECK_SIG (new_signal, signum); - RESET (signal, w, (w, signum)); + RESET_SIGNAL (w, (w, signum)); } } OUTPUT: @@ -917,6 +959,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); @@ -1254,6 +1299,10 @@ void ev_feed_fd_event (struct ev_loop *loop, int fd, int revents = EV_NONE) +unsigned int ev_pending_count (struct ev_loop *loop) + +void ev_invoke_pending (struct ev_loop *loop) + #if 0 void ev_feed_signal_event (struct ev_loop *loop, SV *signal) @@ -1312,8 +1361,6 @@ OUTPUT: RETVAL -#if 0 - ev_signal *signal (struct ev_loop *loop, SV *signal, SV *cb) ALIAS: signal_ns = 1 @@ -1324,13 +1371,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