--- cvsroot/EV/EV.xs 2008/02/01 13:22:48 1.107 +++ cvsroot/EV/EV.xs 2008/05/20 23:49:41 1.112 @@ -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 = e_get_cv (cb_sv); ev_watcher *w; SV *self = NEWSV (0, size); SvPOK_only (self); @@ -145,7 +159,7 @@ 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; @@ -705,10 +719,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 +909,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 +945,7 @@ NV at (ev_periodic *w) CODE: - RETVAL = w->at; + RETVAL = ev_periodic_at (w); OUTPUT: RETVAL @@ -1170,6 +1182,12 @@ 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)