Perl: the Markov chain saw | |
PerlMonks |
Re^7: perlembed: mortalize an AV or not (misc)by tye (Sage) |
on Jul 11, 2006 at 05:52 UTC ( [id://560319]=note: print w/replies, xml ) | Need Help?? |
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
In Section
Seekers of Perl Wisdom
|
|