--- EV/EV.xs 2007/10/29 07:24:37 1.9 +++ EV/EV.xs 2007/10/29 07:56:03 1.10 @@ -26,6 +26,7 @@ #define TIMEOUT_NONE HUGE_VAL typedef struct event_base *Base; +typedef int Signal; static HV *stash_base, *stash_event; @@ -41,6 +42,21 @@ } +static int +sv_signum (SV *sig) +{ + int signum; + + if (SvIV (sig) > 0) + return SvIV (sig); + + for (signum = 1; signum < SIG_SIZE; ++signum) + if (strEQ (SvPV_nolen (sig), PL_sig_name [signum])) + return signum; + + return -1; +} + ///////////////////////////////////////////////////////////////////////////// // Event @@ -255,6 +271,7 @@ BOOT: { + int i; HV *stash = gv_stashpv ("EV", 1); static const struct { @@ -372,11 +389,12 @@ OUTPUT: RETVAL -Event signal (SV *signal, SV *cb) +Event signal (Signal signum, SV *cb) ALIAS: signal_ns = 1 CODE: - RETVAL = e_new (signal, EV_SIGNAL | EV_PERSIST, cb); + RETVAL = e_new (ST (0), EV_SIGNAL | EV_PERSIST, cb); + RETVAL->ev.ev_fd = signum; if (!ix) e_start (RETVAL); OUTPUT: RETVAL @@ -457,8 +475,6 @@ RETVAL SV *fh (Event ev, SV *new_fh = 0) - ALIAS: - signal = 1 CODE: RETVAL = newSVsv (ev->fh); if (items > 1) @@ -466,12 +482,34 @@ if (ev->active) event_del (&ev->ev); sv_setsv (ev->fh, new_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; + ev->ev.ev_events &= ev->ev.ev_events & ~EV_SIGNAL; if (ev->active) event_add (&ev->ev, e_tv (ev)); } OUTPUT: RETVAL +SV *signal (Event ev, SV *new_signal = 0) + CODE: +{ + Signal signum; + + if (items > 1) + signum = sv_signum (new_signal); /* may croak here */ + + RETVAL = newSVsv (ev->fh); + + if (items > 1) + { + if (ev->active) event_del (&ev->ev); + sv_setsv (ev->fh, new_signal); + ev->ev.ev_fd = signum; + ev->ev.ev_events |= EV_SIGNAL; + if (ev->active) event_add (&ev->ev, e_tv (ev)); + } +} + OUTPUT: + RETVAL + short events (Event ev, short new_events = EV_UNDEF) CODE: RETVAL = ev->ev.ev_events;