--- cvsroot/EV/EV.xs 2007/10/31 11:52:11 1.17 +++ cvsroot/EV/EV.xs 2007/10/31 18:28:00 1.22 @@ -2,15 +2,12 @@ #include "perl.h" #include "XSUB.h" -#include -#include +/*#include */ #define TIMEOUT_NONE HUGE_VAL +#define HAVE_EPOLL 1 -#define EV_COMMON \ - SV *self; /* contains this struct */ \ - SV *cb_sv, *fh; - +#define EV_PROTOTYPES 1 #include "EV/EVAPI.h" #include "libev/ev.c" @@ -27,6 +24,7 @@ *stash_periodic, *stash_signal, *stash_idle, + *stash_prepare, *stash_check; static int @@ -44,21 +42,6 @@ return -1; } -static void -api_once (int fd, short events, double timeout, void (*cb)(int, short, void *), void *arg) -{ -#if 0 - if (timeout >= 0.) - { - struct timeval tv; - tv_set (&tv, timeout); - event_once (fd, events, cb, arg, &tv); - } - else - event_once (fd, events, cb, arg, 0); -#endif -} - ///////////////////////////////////////////////////////////////////////////// // Event @@ -213,11 +196,16 @@ } #endif +#define CHECK_REPEAT(repeat) if (repeat < 0.) \ + croak (# repeat " value must be >= 0"); + ///////////////////////////////////////////////////////////////////////////// // XS interface functions MODULE = EV PACKAGE = EV PREFIX = ev_ +PROTOTYPES: ENABLE + BOOT: { int i; @@ -228,6 +216,7 @@ IV iv; } *civ, const_iv[] = { # define const_iv(pfx, name) { # name, (IV) pfx ## name }, + const_iv (EV_, UNDEF) const_iv (EV_, NONE) const_iv (EV_, TIMEOUT) const_iv (EV_, READ) @@ -235,6 +224,7 @@ const_iv (EV_, SIGNAL) const_iv (EV_, IDLE) const_iv (EV_, CHECK) + const_iv (EV_, ERROR) const_iv (EV, LOOP_ONESHOT) const_iv (EV, LOOP_NONBLOCK) @@ -254,6 +244,7 @@ stash_periodic = gv_stashpv ("EV::Periodic", 1); stash_signal = gv_stashpv ("EV::Signal" , 1); stash_idle = gv_stashpv ("EV::Idle" , 1); + stash_prepare = gv_stashpv ("EV::Prepare" , 1); stash_check = gv_stashpv ("EV::Check" , 1); { @@ -263,7 +254,6 @@ /* the poor man's shared library emulator */ evapi.ver = EV_API_VERSION; evapi.rev = EV_API_REVISION; - evapi.once = api_once; evapi.sv_fileno = sv_fileno; evapi.sv_signum = sv_signum; evapi.now = &ev_now; @@ -271,6 +261,7 @@ evapi.loop_done = &ev_loop_done; evapi.time = ev_time; evapi.loop = ev_loop; + evapi.once = ev_once; evapi.io_start = evio_start; evapi.io_stop = evio_stop; evapi.timer_start = evtimer_start; @@ -282,6 +273,8 @@ evapi.signal_stop = evsignal_stop; evapi.idle_start = evidle_start; evapi.idle_stop = evidle_stop; + evapi.prepare_start = evprepare_start; + evapi.prepare_stop = evprepare_stop; evapi.check_start = evcheck_start; evapi.check_stop = evcheck_stop; @@ -326,6 +319,8 @@ struct ev_timer *timer (NV after, NV repeat, SV *cb) ALIAS: timer_ns = 1 + INIT: + CHECK_REPEAT (repeat); CODE: RETVAL = e_new (sizeof (struct ev_timer), cb); evtimer_set (RETVAL, after, repeat); @@ -336,6 +331,8 @@ struct ev_periodic *periodic (NV at, NV interval, SV *cb) ALIAS: periodic_ns = 1 + INIT: + CHECK_REPEAT (interval); CODE: RETVAL = e_new (sizeof (struct ev_periodic), cb); evperiodic_set (RETVAL, at, interval); @@ -363,6 +360,16 @@ OUTPUT: RETVAL +struct ev_prepare *prepare (SV *cb) + ALIAS: + prepare_ns = 1 + CODE: + RETVAL = e_new (sizeof (struct ev_prepare), cb); + evprepare_set (RETVAL); + if (!ix) evprepare_start (RETVAL); + OUTPUT: + RETVAL + struct ev_check *check (SV *cb) ALIAS: check_ns = 1 @@ -468,12 +475,18 @@ MODULE = EV PACKAGE = EV::Timer PREFIX = evtimer_ void evtimer_start (struct ev_timer *w) + INIT: + CHECK_REPEAT (w->repeat); void evtimer_stop (struct ev_timer *w) void evtimer_again (struct ev_timer *w) + INIT: + CHECK_REPEAT (w->repeat); void set (struct ev_timer *w, NV after, NV repeat = 0.) + INIT: + CHECK_REPEAT (repeat); CODE: { int active = w->active; @@ -485,10 +498,14 @@ MODULE = EV PACKAGE = EV::Periodic PREFIX = evperiodic_ void evperiodic_start (struct ev_periodic *w) + INIT: + CHECK_REPEAT (w->interval); void evperiodic_stop (struct ev_periodic *w) void set (struct ev_periodic *w, NV at, NV interval = 0.) + INIT: + CHECK_REPEAT (interval); CODE: { int active = w->active; @@ -503,6 +520,12 @@ void evidle_stop (struct ev_idle *w) +MODULE = EV PACKAGE = EV::Prepare PREFIX = evcheck_ + +void evprepare_start (struct ev_prepare *w) + +void evprepare_stop (struct ev_prepare *w) + MODULE = EV PACKAGE = EV::Check PREFIX = evcheck_ void evcheck_start (struct ev_check *w)