--- cvsroot/EV/EV.xs 2007/10/26 19:11:35 1.5 +++ cvsroot/EV/EV.xs 2007/10/29 07:24:37 1.9 @@ -118,7 +118,7 @@ { double now = e_now (); - if (now > to && ev->interval) + if (ev->interval) ev->timeout = (to += ceil ((now - to) / ev->interval) * ev->interval); to -= now; @@ -171,7 +171,7 @@ ENTER; SAVETMPS; - if (!(ev->ev.ev_events & EV_PERSIST)) + if (!(ev->ev.ev_events & EV_PERSIST) || (events & EV_TIMEOUT)) ev->active = 0; PUSHMARK (SP); @@ -180,12 +180,19 @@ PUSHs (sv_2mortal (newSViv (events))); PUTBACK; call_sv (ev->cb, G_DISCARD | G_VOID | G_EVAL); - /*TODO: if err, call some logging function */ if (ev->interval && !ev->active) e_start (ev); FREETMPS; + + if (SvTRUE (ERRSV)) + { + PUSHMARK (SP); + PUTBACK; + call_sv (get_sv ("EV::DIED", 1), G_DISCARD | G_VOID | G_EVAL | G_KEEPERR); + } + LEAVE; } @@ -230,6 +237,14 @@ call_sv (sv_2mortal (cb), G_DISCARD | G_VOID | G_EVAL); FREETMPS; + + if (SvTRUE (ERRSV)) + { + PUSHMARK (SP); + PUTBACK; + call_sv (get_sv ("EV::DIED", 1), G_DISCARD | G_VOID | G_EVAL | G_KEEPERR); + } + LEAVE; } @@ -314,6 +329,26 @@ OUTPUT: RETVAL +Event timed_io (SV *fh, short events, double timeout, SV *cb) + ALIAS: + timed_io_ns = 1 + CODE: +{ + events = timeout ? events & ~EV_PERSIST : events | EV_PERSIST; + + RETVAL = e_new (fh, events, cb); + + if (timeout) + { + RETVAL->timeout = timeout; + RETVAL->interval = 1; + } + + if (!ix) e_start (RETVAL); +} + OUTPUT: + RETVAL + Event timer (double after, int repeat, SV *cb) ALIAS: timer_ns = 1 @@ -423,14 +458,15 @@ SV *fh (Event ev, SV *new_fh = 0) ALIAS: - signal = 0 + signal = 1 CODE: RETVAL = newSVsv (ev->fh); if (items > 1) { if (ev->active) event_del (&ev->ev); sv_setsv (ev->fh, new_fh); - ev->ev.ev_fd = sv_fileno (ev->fh); + ev->ev.ev_fd = sv_fileno (ev->fh); + ev->ev.ev_events = signal ? ev->ev.ev_events | EV_SIGNAL : ev->ev.ev_events & ~EV_SIGNAL; if (ev->active) event_add (&ev->ev, e_tv (ev)); } OUTPUT: @@ -537,7 +573,7 @@ STRLEN len; char *data = SvPVbyte (addr, len); if (len != (ix ? 16 : 4)) - croak ("ipv4/ipv6 address to resolve must be given as 4/16 byte octet string"); + croak ("ipv4/ipv6 address to be resolved must be given as 4/16 byte octet string"); RETVAL = ix ? evdns_resolve_reverse_ipv6 ((struct in6_addr *)data, flags, dns_cb, (void *)SvREFCNT_inc (cb))