--- cvsroot/EV/EV.xs 2008/05/22 02:44:57 1.113 +++ cvsroot/EV/EV.xs 2008/10/28 08:08:28 1.116 @@ -26,6 +26,20 @@ # include #endif +/* 5.10.0 */ +#ifndef SvREFCNT_inc_NN +# define SvREFCNT_inc_NN(sv) SvREFCNT_inc (sv) +#endif + +#if __GNUC__ >= 3 +# define expect(expr,value) __builtin_expect ((expr),(value)) +#else +# define expect(expr,value) (expr) +#endif + +#define expect_false(expr) expect ((expr) != 0, 0) +#define expect_true(expr) expect ((expr) != 0, 1) + #define e_loop(w) INT2PTR (struct ev_loop *, SvIVX ((w)->loop)) #define WFLAG_KEEPALIVE 1 @@ -145,7 +159,7 @@ static void * e_new (int size, SV *cb_sv, SV *loop) { - SV *cv = e_get_cv (cb_sv); + SV *cv = cb_sv ? e_get_cv (cb_sv) : 0; ev_watcher *w; SV *self = NEWSV (0, size); SvPOK_only (self); @@ -153,7 +167,7 @@ w = (ev_watcher *)SvPVX (self); - ev_init (w, e_cb); + ev_init (w, cv ? e_cb : 0); w->loop = SvREFCNT_inc (SvRV (loop)); w->e_flags = WFLAG_KEEPALIVE; @@ -193,7 +207,7 @@ return rv; } -static SV *sv_events_cache; +static SV *sv_self_cache, *sv_events_cache; static void e_cb (EV_P_ ev_watcher *w, int revents) @@ -202,15 +216,27 @@ I32 mark = SP - PL_stack_base; SV *sv_self, *sv_events; - sv_self = newRV_inc (w->self); /* w->self MUST be blessed by now */ + if (expect_true (sv_self_cache)) + { + sv_self = sv_self_cache; sv_self_cache = 0; + SvRV_set (sv_self, SvREFCNT_inc_NN (w->self)); + } + else + { + sv_self = newRV_inc (w->self); /* w->self MUST be blessed by now */ + SvREADONLY_on (sv_self); + } - if (sv_events_cache) + if (expect_true (sv_events_cache)) { sv_events = sv_events_cache; sv_events_cache = 0; SvIV_set (sv_events, revents); } else - sv_events = newSViv (revents); + { + sv_events = newSViv (revents); + SvREADONLY_on (sv_events); + } PUSHMARK (SP); EXTEND (SP, 2); @@ -220,9 +246,16 @@ PUTBACK; call_sv (w->cb_sv, G_DISCARD | G_VOID | G_EVAL); - SvREFCNT_dec (sv_self); + if (expect_false (sv_self_cache)) + SvREFCNT_dec (sv_self); + else + { + SvREFCNT_dec (SvRV (sv_self)); + SvRV_set (sv_self, &PL_sv_undef); + sv_self_cache = sv_self; + } - if (sv_events_cache) + if (expect_false (sv_events_cache)) SvREFCNT_dec (sv_events); else sv_events_cache = sv_events; @@ -413,6 +446,7 @@ evapi.loop_fork = ev_loop_fork; evapi.loop_count = ev_loop_count; evapi.now = ev_now; + evapi.now_update = ev_now_update; evapi.backend = ev_backend; evapi.unloop = ev_unloop; evapi.ref = ev_ref; @@ -493,6 +527,9 @@ NV ev_now () C_ARGS: evapi.default_loop +void ev_now_update () + C_ARGS: evapi.default_loop + unsigned int ev_backend () C_ARGS: evapi.default_loop @@ -644,7 +681,7 @@ OUTPUT: RETVAL -ev_embed *embed (struct ev_loop *loop, SV *cb = &PL_sv_undef) +ev_embed *embed (struct ev_loop *loop, SV *cb = 0) ALIAS: embed_ns = 1 CODE: @@ -655,9 +692,6 @@ RETVAL = e_new (sizeof (ev_embed), cb, default_loop_sv); RETVAL->fh = newSVsv (ST (0)); ev_embed_set (RETVAL, loop); - - if (!SvOK (cb)) ev_set_cb (RETVAL, 0); - if (!ix) START (embed, RETVAL); } OUTPUT: @@ -1214,6 +1248,8 @@ NV ev_now (struct ev_loop *loop) +void ev_now_update (struct ev_loop *loop) + void ev_set_io_collect_interval (struct ev_loop *loop, NV interval) void ev_set_timeout_collect_interval (struct ev_loop *loop, NV interval) @@ -1366,7 +1402,7 @@ OUTPUT: RETVAL -ev_embed *embed (struct ev_loop *loop, struct ev_loop *other, SV *cb = &PL_sv_undef) +ev_embed *embed (struct ev_loop *loop, struct ev_loop *other, SV *cb = 0) ALIAS: embed_ns = 1 CODE: @@ -1377,9 +1413,6 @@ RETVAL = e_new (sizeof (ev_embed), cb, ST (0)); RETVAL->fh = newSVsv (ST (1)); ev_embed_set (RETVAL, other); - - if (!SvOK (cb)) ev_set_cb (RETVAL, 0); - if (!ix) START (embed, RETVAL); } OUTPUT: