Re: Is it Event.pm or me that's loosing its memory?

[email protected] (Joshua N Pritikin) Sun, 12 May 2002 13:29:09 +0530
Newsgroups perl.loop
Message-ID <[email protected]>
On Sun, May 12, 2002 at 01:10:03AM -0400, Allen Smith wrote:
> On May 11, 11:28pm, Joshua N Pritikin wrote:
> > That means that Event probably has a reference counting bug.
> 
> Sigh... yes. I am wondering myself about a couple things in ev.c:
> 	A. pe_event_invoke. Callbacks only return values via calling
> 	   "unloop('value')", not returning something, right? Thus the
> 	   G_VOID? Then why not also G_DISCARD?

Look at the source code for call_sv in perl.c.  The only things that
G_DISCARD does is turn on the ENTER/SAVETMPS FREETMPS/LEAVE pair.
This is already done in _loop() so we don't need to do it again.
i tried adding G_DISCARD and it doesn't make any difference.

> 	B. pe_event_release decreases the refcount for ev->mysv; the same
> 	   happens in event_2sv thanks to the "sv_2mortal", which
> 	   compensates for the SvREFCNT_inc. But ev->mysv is a
> 	   reference. What decreases the refcount to the thing it's
> 	   referring to?

When the rv is destroyed then it does a SvREFCNT_dec on the SV to which
it is pointing.  See the doc for newSVrv -- the sv is created with
a refcnt=1, so this should work.  You can verify it with $Event::DebugLevel=3;
which turns on a warning "Event=0x%x '%s' destroyed (SV=0x%x)".

Oops, this warning isn't getting triggered.  Well, here is one memory leak.
i don't know why this stopped working.

>          That sv gets created _again_ anytime ev->mysv is 0,
> 	   which it will be if the event has gone through pe_event_release
> 	   (whether or not ev->mysv is freed...).

Correct.

> SV *event_2sv(pe_event *ev) { /**MAKE FAST**/
>     if (!ev->mysv) {
>         SV *rv = newSV(0);
>         SV *sv = newSVrv(rv,0);
>         sv_bless(rv, ev->vtbl->stash);
>         sv_setiv(sv, (IV)ev);
>         ev->mysv = rv;
> 
>         if (WaDEBUGx(ev->up) >= 4) {
>             STRLEN n_a;
>             warn("Event=0x%x '%s' wrapped with SV=0x%x",
>                  ev, SvPV(ev->up->desc, n_a), SvRV(ev->mysv));
>         }
>     }
>     return SvREFCNT_inc(sv_2mortal(ev->mysv));
> }

But if the SvREFCNT_inc is removed then we get:

  "Attempt to free unreferenced scalar ..."

i don't have much time but i'll try to look at this today.

-- 
Victory to the Divine Mother!!         after all,
  http://sahajayoga.org                  http://why-compete.org