in reply to Re^6: perlembed: mortalize an AV or not (misc)
in thread perlembed: mortalize an AV, get "Attempt to free unreferenced scalar" - don't mortalize, leaks memory
Yes, that code looks like it handles ref counts correctly.
So wouldn't it be better if I do mortalize everything, and just SvREFCNT_inc whenever I either av_push() or hv_store() the SV, as well as using newRV_inc()? Will that not work and be correct?
Yes, I was coming to the same conclusion.
I hadn't bothered to grok this much about the ref-count nature of these Perlish macros before (I prefer very simple XS code for a lot of reasons). Now I see more why the Parrot designers think ref counting is so dang hard to get right. Perl's macros make it extra hard (and I found a memory leak in the Perl source already). I think this is mostly motivated by efficiency concerns, and I bet those concerns are overblown, but those are guesses on my part.
I think I'd much rather have a system where ref counts start at 0 and most things increment the ref count (including sv2mortal, av_push). That is, a system where an "extra" increment and decrement will often get done but you don't have to add things up and decide between *_inc and *_noinc and you don't have to consider inc-/decrementing ref counts directly.
Yes, you don't need to call SvREFCNT_inc() in the above code. You could choose to instead only create mortals and SvREFCNT_inc() each time you av_push() or such.
Sorry, I don't have FREETMPS grokked ATM and can't study that just now.
- tye
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^8: perlembed: mortalize an AV or not (Perl leak)
by tye (Sage) on Jul 11, 2006 at 14:55 UTC | |
Re^8: perlembed: mortalize an AV or not (misc)
by edan (Curate) on Jul 11, 2006 at 06:47 UTC | |
by demerphq (Chancellor) on Jul 11, 2006 at 09:29 UTC | |
by tye (Sage) on Jul 11, 2006 at 15:26 UTC |