--- EV/EV.xs 2009/07/08 02:46:05 1.125 +++ EV/EV.xs 2009/07/14 00:09:59 1.126 @@ -2,12 +2,12 @@ #include "perl.h" #include "XSUB.h" -/*#include */ - /* fix perl api breakage */ #undef signal #undef sigaction +#include "schmorp.h" + #define EV_PROTOTYPES 1 #define EV_USE_NANOSLEEP EV_USE_MONOTONIC #define EV_H @@ -26,16 +26,6 @@ # include #endif -/* 5.10.0 */ -#ifndef SvREFCNT_inc_NN -# define SvREFCNT_inc_NN(sv) SvREFCNT_inc (sv) -#endif - -/* 5.6.x */ -#ifndef SvRV_set -# define SvRV_set(a,b) SvRV ((a)) = (b) -#endif - #define e_loop(w) INT2PTR (struct ev_loop *, SvIVX ((w)->loop)) #define WFLAG_KEEPALIVE 1 @@ -98,70 +88,15 @@ *stash_fork, *stash_async; -#ifndef SIG_SIZE -/* kudos to Slaven Rezic for the idea */ -static char sig_size [] = { SIG_NUM }; -# define SIG_SIZE (sizeof (sig_size) + 1) -#endif - -static Signal -sv_signum (SV *sig) -{ - Signal signum; - - SvGETMAGIC (sig); - - for (signum = 1; signum < SIG_SIZE; ++signum) - if (strEQ (SvPV_nolen (sig), PL_sig_name [signum])) - return signum; - - signum = SvIV (sig); - - if (signum > 0 && signum < SIG_SIZE) - return signum; - - return -1; -} - ///////////////////////////////////////////////////////////////////////////// // Event static void e_cb (EV_P_ ev_watcher *w, int revents); -static int -sv_fileno (SV *fh) -{ - SvGETMAGIC (fh); - - if (SvROK (fh)) - fh = SvRV (fh); - - if (SvTYPE (fh) == SVt_PVGV) - return PerlIO_fileno (IoIFP (sv_2io (fh))); - - if (SvOK (fh) && (SvIV (fh) >= 0) && (SvIV (fh) < 0x7fffffffL)) - return SvIV (fh); - - 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; + SV *cv = cb_sv ? s_get_cv_croak (cb_sv) : 0; ev_watcher *w; SV *self = NEWSV (0, size); SvPOK_only (self); @@ -456,8 +391,8 @@ /* the poor man's shared library emulator */ evapi.ver = EV_API_VERSION; evapi.rev = EV_API_REVISION; - evapi.sv_fileno = sv_fileno; - evapi.sv_signum = sv_signum; + evapi.sv_fileno = s_fileno; + evapi.sv_signum = s_signum; evapi.supported_backends = ev_supported_backends (); evapi.recommended_backends = ev_recommended_backends (); evapi.embeddable_backends = ev_embeddable_backends (); @@ -468,12 +403,17 @@ evapi.loop_fork = ev_loop_fork; evapi.loop_count = ev_loop_count; evapi.loop_depth = ev_loop_depth; + evapi.set_userdata = ev_set_userdata; + evapi.userdata = ev_userdata; evapi.now = ev_now; evapi.now_update = ev_now_update; evapi.suspend = ev_suspend; evapi.resume = ev_resume; evapi.backend = ev_backend; evapi.unloop = ev_unloop; + evapi.invoke_pending = ev_invoke_pending; + evapi.set_loop_release_cb = ev_set_loop_release_cb; + evapi.set_invoke_pending_cb= ev_set_invoke_pending_cb; evapi.ref = ev_ref; evapi.unref = ev_unref; evapi.loop = ev_loop; @@ -593,7 +533,7 @@ void ev_feed_signal_event (SV *signal) CODE: { - Signal signum = sv_signum (signal); + Signal signum = s_signum (signal); CHECK_SIG (signal, signum); ev_feed_signal_event (evapi.default_loop, signum); @@ -604,7 +544,7 @@ io_ns = 1 CODE: { - int fd = sv_fileno (fh); + int fd = s_fileno (fh, events & EV_WRITE); CHECK_FD (fh, fd); RETVAL = e_new (sizeof (ev_io), cb, default_loop_sv); @@ -649,7 +589,7 @@ signal_ns = 1 CODE: { - Signal signum = sv_signum (signal); + Signal signum = s_signum (signal); CHECK_SIG (signal, signum); RETVAL = e_new (sizeof (ev_signal), cb, default_loop_sv); @@ -750,7 +690,7 @@ CODE: ev_once ( evapi.default_loop, - sv_fileno (fh), events, + s_fileno (fh, events & EV_WRITE), events, SvOK (timeout) ? SvNV (timeout) : -1., e_once_cb, newSVsv (cb) @@ -794,7 +734,7 @@ { if (items > 1) { - new_cb = e_get_cv (new_cb); + new_cb = s_get_cv_croak (new_cb); RETVAL = newRV_noinc (w->cb_sv); w->cb_sv = SvREFCNT_inc (new_cb); } @@ -874,7 +814,7 @@ void set (ev_io *w, SV *fh, int events) CODE: { - int fd = sv_fileno (fh); + int fd = s_fileno (fh, events & EV_WRITE); CHECK_FD (fh, fd); sv_setsv (w->fh, fh); @@ -886,7 +826,7 @@ { if (items > 1) { - int fd = sv_fileno (new_fh); + int fd = s_fileno (new_fh, w->events & EV_WRITE); CHECK_FD (new_fh, fd); RETVAL = w->fh; @@ -929,7 +869,7 @@ void set (ev_signal *w, SV *signal) CODE: { - Signal signum = sv_signum (signal); + Signal signum = s_signum (signal); CHECK_SIG (signal, signum); RESET (signal, w, (w, signum)); @@ -942,7 +882,7 @@ if (items > 1) { - Signal signum = sv_signum (new_signal); + Signal signum = s_signum (new_signal); CHECK_SIG (new_signal, signum); RESET (signal, w, (w, signum)); @@ -1312,7 +1252,7 @@ void ev_feed_signal_event (struct ev_loop *loop, SV *signal) CODE: { - Signal signum = sv_signum (signal); + Signal signum = s_signum (signal); CHECK_SIG (signal, signum); ev_feed_signal_event (loop, signum); @@ -1325,7 +1265,7 @@ io_ns = 1 CODE: { - int fd = sv_fileno (fh); + int fd = s_fileno (fh, events & EV_WRITE); CHECK_FD (fh, fd); RETVAL = e_new (sizeof (ev_io), cb, ST (0)); @@ -1372,7 +1312,7 @@ signal_ns = 1 CODE: { - Signal signum = sv_signum (signal); + Signal signum = s_signum (signal); CHECK_SIG (signal, signum); RETVAL = e_new (sizeof (ev_signal), cb, ST (0)); @@ -1475,7 +1415,7 @@ CODE: ev_once ( loop, - sv_fileno (fh), events, + s_fileno (fh, events & EV_WRITE), events, SvOK (timeout) ? SvNV (timeout) : -1., e_once_cb, newSVsv (cb)