--- cvsroot/EV/EV.xs 2008/02/01 13:08:54 1.106 +++ cvsroot/EV/EV.xs 2008/07/12 22:19:22 1.114 @@ -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 @@ -129,9 +129,23 @@ return -1; } +static SV * +e_get_cv (SV *cb_sv) +{ + HV *st; + GV *gvp; + CV *cv = sv_2cv (cb_sv, &st, &gvp, 0); + + if (!cv) + croak ("EV watcher callback must be a CODE reference"); + + return (SV *)cv; +} + static void * e_new (int size, SV *cb_sv, SV *loop) { + SV *cv = cb_sv ? e_get_cv (cb_sv) : 0; ev_watcher *w; SV *self = NEWSV (0, size); SvPOK_only (self); @@ -139,13 +153,13 @@ w = (ev_watcher *)SvPVX (self); - ev_init (w, e_cb); + ev_init (w, cv ? e_cb : 0); 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->cb_sv = SvREFCNT_inc (cv); w->self = self; return (void *)w; @@ -392,8 +406,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; @@ -630,7 +644,7 @@ OUTPUT: RETVAL -ev_embed *embed (struct ev_loop *loop, SV *cb = &PL_sv_undef) +ev_embed *embed (struct ev_loop *loop, SV *cb = 0) ALIAS: embed_ns = 1 CODE: @@ -641,9 +655,6 @@ RETVAL = e_new (sizeof (ev_embed), cb, default_loop_sv); RETVAL->fh = newSVsv (ST (0)); ev_embed_set (RETVAL, loop); - - if (!SvOK (cb)) ev_set_cb (RETVAL, 0); - if (!ix) START (embed, RETVAL); } OUTPUT: @@ -705,10 +716,14 @@ SV *cb (ev_watcher *w, SV *new_cb = 0) CODE: { - RETVAL = newSVsv (w->cb_sv); - if (items > 1) - sv_setsv (w->cb_sv, new_cb); + { + new_cb = e_get_cv (new_cb); + RETVAL = newRV_noinc (w->cb_sv); + w->cb_sv = SvREFCNT_inc (new_cb); + } + else + RETVAL = newRV_inc (w->cb_sv); } OUTPUT: RETVAL @@ -891,12 +906,6 @@ CODE: RESET (timer, w, (w, after, repeat)); -NV at (ev_timer *w) - CODE: - RETVAL = w->at; - OUTPUT: - RETVAL - MODULE = EV PACKAGE = EV::Periodic PREFIX = ev_periodic_ void ev_periodic_start (ev_periodic *w) @@ -933,7 +942,7 @@ NV at (ev_periodic *w) CODE: - RETVAL = w->at; + RETVAL = ev_periodic_at (w); OUTPUT: RETVAL @@ -1149,6 +1158,9 @@ 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) @@ -1164,6 +1176,15 @@ STOP (async, w); e_destroy (w); +void ev_async_send (ev_async *w) + C_ARGS: e_loop (w), w + +SV *ev_async_async_pending (ev_async *w) + CODE: + RETVAL = boolSV (ev_async_pending (w)); + OUTPUT: + RETVAL + MODULE = EV PACKAGE = EV::Loop PREFIX = ev_ SV *new (SV *klass, unsigned int flags = 0) @@ -1186,6 +1207,8 @@ void ev_loop_fork (struct ev_loop *loop) +void ev_loop_verify (struct ev_loop *loop) + NV ev_now (struct ev_loop *loop) void ev_set_io_collect_interval (struct ev_loop *loop, NV interval) @@ -1340,7 +1363,7 @@ OUTPUT: RETVAL -ev_embed *embed (struct ev_loop *loop, struct ev_loop *other, SV *cb = &PL_sv_undef) +ev_embed *embed (struct ev_loop *loop, struct ev_loop *other, SV *cb = 0) ALIAS: embed_ns = 1 CODE: @@ -1351,9 +1374,6 @@ RETVAL = e_new (sizeof (ev_embed), cb, ST (0)); RETVAL->fh = newSVsv (ST (1)); ev_embed_set (RETVAL, other); - - if (!SvOK (cb)) ev_set_cb (RETVAL, 0); - if (!ix) START (embed, RETVAL); } OUTPUT: