--- cvsroot/EV/EV.xs 2007/12/22 16:37:08 1.102 +++ cvsroot/EV/EV.xs 2008/04/02 07:59:17 1.109 @@ -4,15 +4,15 @@ /*#include */ +/* fix perl api breakage */ +#undef signal +#undef sigaction + #define EV_PROTOTYPES 1 #define EV_USE_NANOSLEEP EV_USE_MONOTONIC #define EV_H #include "EV/EVAPI.h" -/* fix perl api breakage */ -#undef signal -#undef sigaction - #define EV_SELECT_IS_WINSOCKET 0 #ifdef _WIN32 # define EV_SELECT_USE_FD_SET 0 @@ -31,25 +31,25 @@ #define WFLAG_KEEPALIVE 1 #define UNREF(w) \ - if (!((w)->flags & WFLAG_KEEPALIVE) \ + if (!((w)->e_flags & WFLAG_KEEPALIVE) \ && !ev_is_active (w)) \ ev_unref (e_loop (w)); #define REF(w) \ - if (!((w)->flags & WFLAG_KEEPALIVE) \ + if (!((w)->e_flags & WFLAG_KEEPALIVE) \ && ev_is_active (w)) \ ev_ref (e_loop (w)); #define START(type,w) \ do { \ UNREF (w); \ - ev_ ## type ## _start (e_loop (w), w); \ + ev_ ## type ## _start (e_loop (w), w); \ } while (0) #define STOP(type,w) \ do { \ REF (w); \ - ev_ ## type ## _stop (e_loop (w), w); \ + ev_ ## type ## _stop (e_loop (w), w); \ } while (0) #define RESET(type,w,seta) \ @@ -79,7 +79,8 @@ *stash_prepare, *stash_check, *stash_embed, - *stash_fork; + *stash_fork, + *stash_async; #ifndef SIG_SIZE /* kudos to Slaven Rezic for the idea */ @@ -140,12 +141,12 @@ ev_init (w, e_cb); - w->loop = SvREFCNT_inc (SvRV (loop)); - w->flags = WFLAG_KEEPALIVE; - w->data = 0; - w->fh = 0; - w->cb_sv = SvTEMP (cb_sv) && SvREFCNT (cb_sv) == 1 ? SvREFCNT_inc (cb_sv) : newSVsv (cb_sv); - w->self = self; + w->loop = SvREFCNT_inc (SvRV (loop)); + w->e_flags = WFLAG_KEEPALIVE; + w->data = 0; + w->fh = 0; + w->cb_sv = SvTEMP (cb_sv) && SvREFCNT (cb_sv) == 1 ? SvREFCNT_inc (cb_sv) : newSVsv (cb_sv); + w->self = self; return (void *)w; } @@ -377,6 +378,7 @@ stash_embed = gv_stashpv ("EV::Embed" , 1); stash_stat = gv_stashpv ("EV::Stat" , 1); stash_fork = gv_stashpv ("EV::Fork" , 1); + stash_async = gv_stashpv ("EV::Async" , 1); { SV *sv = perl_get_sv ("EV::API", TRUE); @@ -390,8 +392,8 @@ evapi.supported_backends = ev_supported_backends (); evapi.recommended_backends = ev_recommended_backends (); evapi.embeddable_backends = ev_embeddable_backends (); - evapi.time = ev_time; - evapi.sleep = ev_sleep; + evapi.time_ = ev_time; + evapi.sleep_ = ev_sleep; evapi.loop_new = ev_loop_new; evapi.loop_destroy = ev_loop_destroy; evapi.loop_fork = ev_loop_fork; @@ -428,6 +430,9 @@ evapi.embed_sweep = ev_embed_sweep; evapi.fork_start = ev_fork_start; evapi.fork_stop = ev_fork_stop; + evapi.async_start = ev_async_start; + evapi.async_stop = ev_async_stop; + evapi.async_send = ev_async_send; evapi.clear_pending = ev_clear_pending; evapi.invoke = ev_invoke; @@ -489,7 +494,7 @@ void ev_loop (int flags = 0) C_ARGS: evapi.default_loop, flags -void ev_unloop (int how = 1) +void ev_unloop (int how = EVUNLOOP_ONE) C_ARGS: evapi.default_loop, how void ev_feed_fd_event (int fd, int revents = EV_NONE) @@ -604,12 +609,12 @@ OUTPUT: RETVAL -ev_child *child (int pid, SV *cb) +ev_child *child (int pid, int trace, SV *cb) ALIAS: child_ns = 1 CODE: RETVAL = e_new (sizeof (ev_child), cb, default_loop_sv); - ev_child_set (RETVAL, pid); + ev_child_set (RETVAL, pid, trace); if (!ix) START (child, RETVAL); OUTPUT: RETVAL @@ -644,6 +649,16 @@ OUTPUT: RETVAL +ev_async *async (SV *cb) + ALIAS: + async_ns = 1 + CODE: + RETVAL = e_new (sizeof (ev_async), cb, default_loop_sv); + ev_async_set (RETVAL); + if (!ix) START (async, RETVAL); + OUTPUT: + RETVAL + void once (SV *fh, int events, SV *timeout, SV *cb) CODE: ev_once ( @@ -674,13 +689,13 @@ int keepalive (ev_watcher *w, int new_value = 0) CODE: { - RETVAL = w->flags & WFLAG_KEEPALIVE; + RETVAL = w->e_flags & WFLAG_KEEPALIVE; new_value = new_value ? WFLAG_KEEPALIVE : 0; - if (items > 1 && ((new_value ^ w->flags) & WFLAG_KEEPALIVE)) + if (items > 1 && ((new_value ^ w->e_flags) & WFLAG_KEEPALIVE)) { REF (w); - w->flags = (w->flags & ~WFLAG_KEEPALIVE) | new_value; + w->e_flags = (w->e_flags & ~WFLAG_KEEPALIVE) | new_value; UNREF (w); } } @@ -997,27 +1012,18 @@ STOP (child, w); e_destroy (w); -void set (ev_child *w, int pid) - CODE: - RESET (child, w, (w, pid)); - -int pid (ev_child *w, int new_pid = 0) +void set (ev_child *w, int pid, int trace) CODE: -{ - RETVAL = w->pid; + RESET (child, w, (w, pid, trace)); - if (items > 1) - RESET (child, w, (w, new_pid)); -} - OUTPUT: - RETVAL - - -int rstatus (ev_child *w) +int pid (ev_child *w) ALIAS: - rpid = 1 + rpid = 1 + rstatus = 2 CODE: - RETVAL = ix ? w->rpid : w->rstatus; + RETVAL = ix == 0 ? w->pid + : ix == 1 ? w->rpid + : w->rstatus; OUTPUT: RETVAL @@ -1143,6 +1149,27 @@ OUTPUT: RETVAL +void ev_embed_sweep (ev_embed *w) + C_ARGS: e_loop (w), w + +MODULE = EV PACKAGE = EV::Async PREFIX = ev_async_ + +void ev_async_start (ev_async *w) + CODE: + START (async, w); + +void ev_async_stop (ev_async *w) + CODE: + STOP (async, w); + +void DESTROY (ev_async *w) + CODE: + STOP (async, w); + e_destroy (w); + +void ev_async_send (ev_async *w) + C_ARGS: e_loop (w), w + MODULE = EV PACKAGE = EV::Loop PREFIX = ev_ SV *new (SV *klass, unsigned int flags = 0) @@ -1298,12 +1325,12 @@ OUTPUT: RETVAL -ev_child *child (struct ev_loop *loop, int pid, SV *cb) +ev_child *child (struct ev_loop *loop, int pid, int trace, SV *cb) ALIAS: child_ns = 1 CODE: RETVAL = e_new (sizeof (ev_child), cb, ST (0)); - ev_child_set (RETVAL, pid); + ev_child_set (RETVAL, pid, trace); if (!ix) START (child, RETVAL); OUTPUT: RETVAL @@ -1338,6 +1365,16 @@ OUTPUT: RETVAL +ev_async *async (struct ev_loop *loop, SV *cb) + ALIAS: + async_ns = 1 + CODE: + RETVAL = e_new (sizeof (ev_async), cb, ST (0)); + ev_async_set (RETVAL); + if (!ix) START (async, RETVAL); + OUTPUT: + RETVAL + void once (struct ev_loop *loop, SV *fh, int events, SV *timeout, SV *cb) CODE: ev_once (