--- EV/EV.xs 2007/10/29 07:56:03 1.10 +++ EV/EV.xs 2007/10/29 08:48:07 1.11 @@ -25,9 +25,13 @@ #define TIMEOUT_NONE HUGE_VAL +#include "EV/EVAPI.h" + typedef struct event_base *Base; typedef int Signal; +static struct EVAPI evapi; + static HV *stash_base, *stash_event; static double tv_get (struct timeval *tv) @@ -57,6 +61,19 @@ return -1; } +static void +api_once (int fd, short events, double timeout, void (*cb)(int, short, void *), void *arg) +{ + if (timeout) + { + struct timeval tv; + tv_set (&tv, timeout); + event_once (fd, events, cb, arg, &tv); + } + else + event_once (fd, events, cb, arg, 0); +} + ///////////////////////////////////////////////////////////////////////////// // Event @@ -71,7 +88,7 @@ } *Event; static double -e_now () +e_now (void) { struct timeval tv; gettimeofday (&tv, 0); @@ -299,6 +316,19 @@ stash_base = gv_stashpv ("EV::Base" , 1); stash_event = gv_stashpv ("EV::Event", 1); + + { + SV *sv = perl_get_sv ("EV::API", TRUE); + perl_get_sv ("EV::API", TRUE); /* silence 5.10 warning */ + + evapi.ver = EV_API_VERSION; + evapi.rev = EV_API_REVISION; + evapi.now = e_now; + evapi.once = api_once; + + sv_setiv (sv, (IV)&evapi); + SvREADONLY_on (sv); + } } double now ()