Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: Having memory leak issues with perl-c

2 views
Skip to first unread message

Mark Murawski

unread,
Aug 12, 2022, 6:30:05 PM8/12/22
to demerphq, per...@perl.org
On 8/12/22 18:11, Mark Murawski wrote:
On 8/4/22 15:10, demerphq wrote:
On Thu, 4 Aug 2022 at 17:04, Mark Murawski <markm...@intellasoft.net> wrote:
On 8/4/22 02:50, demerphq wrote:
On Thu, 4 Aug 2022 at 01:58, Mark Murawski <markm...@intellasoft.net> wrote:
I'm still not getting something... if I want to fix the code-as-is and do this:

    FNsv = get_sv("main::_FN", GV_ADD);
    if (!FNsv)
        ereport(ERROR,
                (errcode(ERRCODE_EXTERNAL_ROUTINE_EXCEPTION),
                 errmsg("couldn't fetch $_FN")));

    save_item(FNsv);            /* local $_FN */

I dont get the sequence here. You take the old value of $main::_FN and then you localize it after you fetch it? That seems weird.

You did not respond to this comment ^^


The reason for the save_item*( was because I was modeling this code on another section that uses save_item() to accomplish something similar (to send internal postgres details to some perl).  I don't know why the original author uses save_item() for this purpose.


Oh... I know why save_item is used.  It's because this code can be executed multiple times in the same perl process.  So each one needs it's own _FN


Mark Murawski

unread,
Aug 12, 2022, 7:30:06 PM8/12/22
to demerphq, per...@perl.org
After a serious amount of trial and error... I got it to stop crashing and I fixed the leak


    HV         *hv;          // hash
    SV         *FNsv;        // scalar reference to the hash
    SV         *SVhv;

    ENTER;
    SAVETMPS;


    FNsv = get_sv("main::_FN", GV_ADD);
    save_item(FNsv);            /* local $_FN */

    hv = newHV();               // create new hash
    SVhv = newRV_noinc((SV *) hv);

    sv_setsv(FNsv, SVhv);
    hv_store_string(hv, "name", cstr2sv(desc->proname));

    PUTBACK;
    FREETMPS;
    LEAVE;

    SvREFCNT_dec_current(SVhv);


The fix I found was to put SvREFCNT_dec_current *after* PUTBACK/FREETMPS/LEAVE

if you do the SvREFCNT_dec_current prior.. then it leaks


If the trailing end of the code looks like this... you get a leak


    SvREFCNT_dec_current(SVhv);

    PUTBACK;
    FREETMPS;
    LEAVE;


0 new messages