Mailing List Archive

Re: Out of Memory! -- any ideas? (fwd)
larry, did this get fixed recently? it still leaks in my copy.

------- start of forwarded message -------
Path: csnews!boulder!news.coop.net!coopnews.coop.net!indra.com!world!news.kei.com!news.mathworks.com!uunet!in1.uu.net!news.iii.net!iii2.iii.net!not-for-mail
From: elliot@iii2.iii.net (Elliot Mednick)
Newsgroups: comp.lang.perl.misc
Subject: Re: Out of Memory! -- any ideas?
Date: 9 Oct 1995 10:22:08 -0400
Organization: iii-net
Lines: 33
Message-ID: <45bb6g$o49@iii2.iii.net>
References: <Pine.3.89.9509271208.B29277-0100000@use1.eglin.af.mil> <44q76v$pg@nntp5.u.washington.edu> <453r8o$2dv@iii2.iii.net> <456rc6$guc@csnews.cs.colorado.edu>
NNTP-Posting-Host: iii2.iii.net
X-Newsreader: TIN [version 1.2 PL2]

Tom Christiansen (tchrist@mox.perl.com) wrote:

: Failed evals always leak.

My code looks like this:

eval ($statement);
if ($@) {
&report_error();
}

No error is reported and memory leaks anyway. 5.001m.

This reproduces the problem:

for ($i = i; $i < 10000000; $i++) {
&do_it ($i);
}

sub do_it
{
local $b;
local $expr = '$b = $_[0]';
# eval ('$b = $a;'); # this eats memory
# eval {$b = $_[0]}; # this does not eat memory
eval "$expr"; # this also eats memory
# print "$b\n";
}
--
Elliot Mednick P.O. Box 150
Wellspring Solutions, Inc. Sutton, MA. 01590
(508) 865-7271
<elliot@wellspring.com> (508) 865-1113 [fax]
------- end of forwarded message -------

--
Tom Christiansen Perl Consultant, Gamer, Hiker tchrist@mox.perl.com

Ear, but earn and wear and tear
Do not rhyme with here but ere.
Re: Out of Memory! -- any ideas? (fwd) [ In reply to ]
: larry, did this get fixed recently? it still leaks in my copy.

I sent out a patch for that. You must have missed it.

*** pp_ctl.c@@/main/19 Mon Mar 13 16:47:39 1995
--- pp_ctl.c Sat Mar 18 17:33:36 1995
***************
*** 1874,1882 ****

comppadlist = newAV();
AvREAL_off(comppadlist);
! av_store(comppadlist, 0, SvREFCNT_inc((SV*)comppad_name));
! av_store(comppadlist, 1, SvREFCNT_inc((SV*)comppad));
CvPADLIST(compcv) = comppadlist;

/* make sure we compile in the right package */

--- 1874,1883 ----

comppadlist = newAV();
AvREAL_off(comppadlist);
! av_store(comppadlist, 0, (SV*)comppad_name);
! av_store(comppadlist, 1, (SV*)comppad);
CvPADLIST(compcv) = comppadlist;
+ SAVEFREESV(compcv);

/* make sure we compile in the right package */

***************
*** 1929,1935 ****
rschar = nrschar;
rspara = (nrslen == 2);
compiling.cop_line = 0;
- SAVEFREESV(compcv);
SAVEFREEOP(eval_root);
if (gimme & G_ARRAY)
list(eval_root);
--- 1930,1935 ----

*** toke.c@@/main/35 Mon Mar 13 15:52:31 1995
--- toke.c Sat Mar 18 17:32:33 1995
***************
*** 4652,4660 ****
sv_upgrade((SV *)compcv, SVt_PVCV);

comppad = newAV();
- SAVEFREESV((SV*)comppad);
comppad_name = newAV();
- SAVEFREESV((SV*)comppad_name);
comppad_name_fill = 0;
min_intro_pending = 0;
av_push(comppad, Nullsv);
--- 4652,4658 ----
***************
*** 4664,4671 ****

comppadlist = newAV();
AvREAL_off(comppadlist);
! av_store(comppadlist, 0, SvREFCNT_inc((SV*)comppad_name));
! av_store(comppadlist, 1, SvREFCNT_inc((SV*)comppad));

CvPADLIST(compcv) = comppadlist;
CvOUTSIDE(compcv) = (CV*)SvREFCNT_inc((SV*)outsidecv);
--- 4662,4669 ----

comppadlist = newAV();
AvREAL_off(comppadlist);
! av_store(comppadlist, 0, (SV*)comppad_name);
! av_store(comppadlist, 1, (SV*)comppad);

CvPADLIST(compcv) = comppadlist;
CvOUTSIDE(compcv) = (CV*)SvREFCNT_inc((SV*)outsidecv);

*** op.c@@/main/38 Tue Mar 14 15:23:05 1995
--- op.c Sat Mar 18 17:33:52 1995
***************
*** 2161,2167 ****
curop->op_type == OP_PADHV ||
curop->op_type == OP_PADANY) {
SV **svp = AvARRAY(comppad_name);
! SV *sv = svp[curop->op_targ];;
if (SvCUR(sv) == generation)
break;
SvCUR(sv) = generation; /* (SvCUR not used any more) */
--- 2161,2167 ----
curop->op_type == OP_PADHV ||
curop->op_type == OP_PADANY) {
SV **svp = AvARRAY(comppad_name);
! SV *sv = svp[curop->op_targ];
if (SvCUR(sv) == generation)
break;
SvCUR(sv) = generation; /* (SvCUR not used any more) */
***************
*** 2627,2651 ****
SAVESPTR(curpad);
curpad = 0;

! if (!SvFLAGS(cv) & SVpcv_CLONED)
op_free(CvROOT(cv));
CvROOT(cv) = Nullop;
- if (CvPADLIST(cv)) {
- I32 i = AvFILL(CvPADLIST(cv));
- while (i >= 0) {
- SV** svp = av_fetch(CvPADLIST(cv), i--, FALSE);
- if (svp)
- SvREFCNT_dec(*svp);
- }
- SvREFCNT_dec((SV*)CvPADLIST(cv));
- CvPADLIST(cv) = Nullav;
- }
- SvREFCNT_dec(CvGV(cv));
- CvGV(cv) = Nullgv;
- SvREFCNT_dec(CvOUTSIDE(cv));
- CvOUTSIDE(cv) = Nullcv;
LEAVE;
}
}

CV *
--- 2627,2651 ----
SAVESPTR(curpad);
curpad = 0;

! if (!(SvFLAGS(cv) & SVpcv_CLONED))
op_free(CvROOT(cv));
CvROOT(cv) = Nullop;
LEAVE;
}
+ SvREFCNT_dec(CvGV(cv));
+ CvGV(cv) = Nullgv;
+ SvREFCNT_dec(CvOUTSIDE(cv));
+ CvOUTSIDE(cv) = Nullcv;
+ if (CvPADLIST(cv)) {
+ I32 i = AvFILL(CvPADLIST(cv));
+ while (i >= 0) {
+ SV** svp = av_fetch(CvPADLIST(cv), i--, FALSE);
+ if (svp)
+ SvREFCNT_dec(*svp);
+ }
+ SvREFCNT_dec((SV*)CvPADLIST(cv));
+ CvPADLIST(cv) = Nullav;
+ }
}

CV *
***************
*** 2761,2766 ****
--- 2761,2767 ----
CvOUTSIDE(cv) = CvOUTSIDE(compcv);
CvOUTSIDE(compcv) = 0;
CvPADLIST(cv) = CvPADLIST(compcv);
+ CvPADLIST(compcv) = 0;
SvREFCNT_dec(compcv);
}
else {
***************
*** 2969,2979 ****
if (!SvPADMY(curpad[ix]))
SvPADTMP_on(curpad[ix]);
}
-
- CvPADLIST(cv) = av = newAV();
- AvREAL_off(av);
- av_store(av, 1, SvREFCNT_inc((SV*)comppad));
- AvFILL(av) = 1;

CvROOT(cv) = newUNOP(OP_LEAVEWRITE, 0, scalarseq(block));
CvSTART(cv) = LINKLIST(CvROOT(cv));
--- 2970,2975 ----

*** perl.c@@/main/12 Sun Mar 12 00:14:11 1995
--- perl.c Sat Mar 18 17:33:46 1995
***************
*** 407,414 ****

comppadlist = newAV();
AvREAL_off(comppadlist);
! av_store(comppadlist, 0, SvREFCNT_inc((SV*)comppad_name));
! av_store(comppadlist, 1, SvREFCNT_inc((SV*)comppad));
CvPADLIST(compcv) = comppadlist;

if (xsinit)
--- 407,414 ----

comppadlist = newAV();
AvREAL_off(comppadlist);
! av_store(comppadlist, 0, (SV*)comppad_name);
! av_store(comppadlist, 1, (SV*)comppad);
CvPADLIST(compcv) = comppadlist;

if (xsinit)

Larry
Re: Out of Memory! -- any ideas? (fwd) [ In reply to ]
On Tue, 10 Oct 1995 08:55:43 PDT, Larry Wall wrote:
>: larry, did this get fixed recently? it still leaks in my copy.
>
>I sent out a patch for that. You must have missed it.
>

Just a little note to say that might not apply properly over 5.001m
because this fix in op.c

<! if (!SvFLAGS(cv) & SVpcv_CLONED)
---
>! if (!(SvFLAGS(cv) & SVpcv_CLONED))

was already part of 5.001m. Maybe the reason why Tom still has the leak
problem (seeing this patch was already on his site for some time and
he might have applied it).

>
>Larry
>

- Sarathy.
gsar@engin.umich.edu