On Sat, 2005-04-23 at 10:48 +0300, Nikita Savin wrote: > > Can you confirm? > > Yes, no memory leak with Epoll::one_event()
OK, this is strange. I am passing G_VOID into a Perl_call_* function and it's returning *1* instead of zero, which seems to be contrary to the perlcall man page. (near ev.c:307) Does the attached patch work for you? -- If you are an American then support http://fairtax.org (Permanently replace 50,000+ pages of tax law with about 200 pages.)
*** ./c/ev.c Wed Dec 8 04:32:23 2004 --- ./c/ev.c Sat Apr 23 21:18:03 2005 *************** *** 299,320 **** if (EvPERLCB(ev)) { SV *cb = SvRV((SV*)ev->callback); int pcflags = G_VOID | (SvIVX(Eval)? G_EVAL : 0); ! dSP; SV *evsv = event_2sv(ev); if (SvTYPE(cb) == SVt_PVCV) { - PUSHMARK(SP); XPUSHs(evsv); PUTBACK; ! perl_call_sv((SV*) ev->callback, pcflags); } else { AV *av = (AV*)cb; assert(SvTYPE(cb) == SVt_PVAV); - PUSHMARK(SP); XPUSHs(*av_fetch(av, 0, 0)); XPUSHs(evsv); PUTBACK; ! perl_call_method(SvPV(*av_fetch(av, 1, 0),n_a), pcflags); } if (SvTRUE(ERRSV)) { if (pcflags & G_EVAL) pe_callback_died(frp); --- 299,323 ---- if (EvPERLCB(ev)) { SV *cb = SvRV((SV*)ev->callback); int pcflags = G_VOID | (SvIVX(Eval)? G_EVAL : 0); ! int retcnt; SV *evsv = event_2sv(ev); + dSP; + PUSHMARK(SP); if (SvTYPE(cb) == SVt_PVCV) { XPUSHs(evsv); PUTBACK; ! retcnt = perl_call_sv((SV*) ev->callback, pcflags); } else { AV *av = (AV*)cb; assert(SvTYPE(cb) == SVt_PVAV); XPUSHs(*av_fetch(av, 0, 0)); XPUSHs(evsv); PUTBACK; ! retcnt = perl_call_method(SvPV(*av_fetch(av, 1, 0),n_a), pcflags); } + SPAGAIN; + SP -= retcnt; + PUTBACK; if (SvTRUE(ERRSV)) { if (pcflags & G_EVAL) pe_callback_died(frp);
signature.asc
Description: This is a digitally signed message part