--- EV/EV.xs 2020/01/22 22:24:53 1.179 +++ EV/EV.xs 2020/01/22 23:17:31 1.180 @@ -871,23 +871,27 @@ void ev_feed_event (ev_watcher *w, int revents = EV_NONE) C_ARGS: e_loop (w), w, revents -int keepalive (ev_watcher *w, int new_value = 0) +int keepalive (ev_watcher *w, SV *new_value = NO_INIT) CODE: { RETVAL = w->e_flags & WFLAG_KEEPALIVE; - new_value = new_value ? WFLAG_KEEPALIVE : 0; - if (items > 1 && ((new_value ^ w->e_flags) & WFLAG_KEEPALIVE)) + if (items > 1) { - w->e_flags = (w->e_flags & ~WFLAG_KEEPALIVE) | new_value; - REF (w); - UNREF (w); + int value = SvTRUE (new_value) ? WFLAG_KEEPALIVE : 0; + + if ((value ^ w->e_flags) & WFLAG_KEEPALIVE) + { + w->e_flags = (w->e_flags & ~WFLAG_KEEPALIVE) | value; + REF (w); + UNREF (w); + } } } OUTPUT: RETVAL -SV *cb (ev_watcher *w, SV *new_cb = 0) +SV *cb (ev_watcher *w, SV *new_cb = NO_INIT) CODE: { if (items > 1) @@ -902,7 +906,7 @@ OUTPUT: RETVAL -SV *data (ev_watcher *w, SV *new_data = 0) +SV *data (ev_watcher *w, SV *new_data = NO_INIT) CODE: { RETVAL = w->data ? newSVsv (w->data) : &PL_sv_undef; @@ -922,7 +926,7 @@ OUTPUT: RETVAL -int priority (ev_watcher *w, int new_priority = 0) +int priority (ev_watcher *w, SV *new_priority = NO_INIT) CODE: { RETVAL = w->priority; @@ -940,7 +944,7 @@ call_method ("stop", G_DISCARD | G_VOID); } - ev_set_priority (w, new_priority); + ev_set_priority (w, SvIV (new_priority)); if (active) { @@ -979,7 +983,7 @@ RESET (io, w, (w, fd, events)); } -SV *fh (ev_io *w, SV *new_fh = 0) +SV *fh (ev_io *w, SV *new_fh = NO_INIT) CODE: { if (items > 1) @@ -998,7 +1002,7 @@ OUTPUT: RETVAL -int events (ev_io *w, int new_events = EV_UNDEF) +int events (ev_io *w, int new_events = NO_INIT) CODE: { RETVAL = w->events; @@ -1037,7 +1041,7 @@ RESET_SIGNAL (w, (w, signum)); } -int signal (ev_signal *w, SV *new_signal = 0) +int signal (ev_signal *w, SV *new_signal = NO_INIT) CODE: { RETVAL = w->signum; @@ -1046,7 +1050,6 @@ { Signal signum = s_signum (new_signal); CHECK_SIG (new_signal, signum); - RESET_SIGNAL (w, (w, signum)); } } @@ -1067,11 +1070,16 @@ void ev_timer_again (ev_timer *w, NV repeat = NO_INIT) CODE: +{ if (items > 1) - w->repeat = repeat; - CHECK_REPEAT (w->repeat); + { + CHECK_REPEAT (repeat); + w->repeat = repeat; + } + ev_timer_again (e_loop (w), w); UNREF (w); +} NV ev_timer_remaining (ev_timer *w) C_ARGS: e_loop (w), w @@ -1087,6 +1095,18 @@ CODE: RESET (timer, w, (w, after, repeat)); +NV repeat (ev_timer *w, SV *new_repeat = NO_INIT) + CODE: + RETVAL = w->repeat; + if (items > 1) + { + NV repeat = SvNV (new_repeat); + CHECK_REPEAT (repeat); + w->repeat = repeat; + } + OUTPUT: + RETVAL + MODULE = EV PACKAGE = EV::Periodic PREFIX = ev_periodic_ void ev_periodic_start (ev_periodic *w) @@ -1126,6 +1146,37 @@ OUTPUT: RETVAL +NV offset (ev_periodic *w, SV *new_offset = NO_INIT) + CODE: + RETVAL = w->offset; + if (items > 1) + w->offset = SvNV (new_offset); + OUTPUT: + RETVAL + +NV interval (ev_periodic *w, SV *new_interval = NO_INIT) + CODE: + RETVAL = w->interval; + if (items > 1) + { + NV interval = SvNV (new_interval); + CHECK_REPEAT (interval); + w->interval = interval; + } + OUTPUT: + RETVAL + +SV *reschedule_cb (ev_periodic *w, SV *new_reschedule_cb = NO_INIT) + CODE: + RETVAL = e_fh (w) ? e_fh (w) : &PL_sv_undef; + if (items > 1) + { + sv_2mortal (RETVAL); + e_fh (w) = SvTRUE (new_reschedule_cb) ? newSVsv (new_reschedule_cb) : 0; + } + OUTPUT: + RETVAL + MODULE = EV PACKAGE = EV::Idle PREFIX = ev_idle_ void ev_idle_start (ev_idle *w) @@ -1268,14 +1319,14 @@ RESET (stat, w, (w, SvPVbyte_nolen (e_fh (w)), interval)); } -SV *path (ev_stat *w, SV *new_path = 0) +SV *path (ev_stat *w, SV *new_path = NO_INIT) CODE: { - RETVAL = SvREFCNT_inc (e_fh (w)); + RETVAL = e_fh (w) ? e_fh (w) : &PL_sv_undef; if (items > 1) { - SvREFCNT_dec (e_fh (w)); + sv_2mortal (RETVAL); e_fh (w) = newSVsv (new_path); RESET (stat, w, (w, SvPVbyte_nolen (e_fh (w)), w->interval)); } @@ -1283,14 +1334,15 @@ OUTPUT: RETVAL -NV interval (ev_stat *w, NV new_interval = 0.) +NV interval (ev_stat *w, SV *new_interval = NO_INIT) CODE: -{ RETVAL = w->interval; - if (items > 1) - RESET (stat, w, (w, SvPVbyte_nolen (e_fh (w)), new_interval)); -} + { + PAUSE (stat); + w->interval = SvNV (new_interval); + RESUME (stat); + } OUTPUT: RETVAL