Re: Memory leak in Perl 5.12.1

[email protected] ("Craig A. Berry") Thu, 01 Jul 2010 19:02:49 -0500
Newsgroups perl.vmsperl
Message-ID <[email protected]>
On Jul 1, 2010, at 6:43 PM, Mark Berryman wrote:

>
> On Jun 30, 2010, at 6:52 PM, Craig A. Berry wrote:
>
>>
>> On Jun 28, 2010, at 4:32 PM, Mark Berryman wrote:
>>
>>> Sometime between Perl 5.8.6 and 5.12.1 a memory leak was  
>>> introduced into Perl and it appears to be in the glob function.   
>>> The following should reproduce the problem on any VMS system:
>>>
>>> @dirs = glob('SYS$COMMON:[000000]*.DIR');
>>>
>>> for (;;) {
>>> foreach (@dirs) {
>>>  s|\[000000\]|\[|;
>>>  $_ = substr($_, 0, rindex(uc($_), '.DIR')) . ']';
>>>  @files = glob($_ . '*.*;*');
>>> }
>>> }
>>>
>>> Execute this and then repeatedly hit control-T to watch your  
>>> memory consumption climbing.  Let it run long enough and it will  
>>> eventually abort due to insufficient virtual memory.
>>>
>>
>> I can confirm that it chews memory pretty fast (about 4,000 pages  
>> every 5 seconds on my rx2600).  There is a Perl_vms_start_glob()  
>> function in [.vms]vms.c if anyone is hankering after a session with  
>> the heap analyzer and wants to know where to look.  I hope to look  
>> into this at some point but can't commit to when.
>>
>
> I found it.
>
> In VMS.C, the routine Perl_flex_stat_int allocates memory twice  
> without ever releasing it.  Here are the two instances:
>    fileified = PerlMem_malloc(VMS_MAXRSS);
>    temp_fspec = PerlMem_malloc(VMS_MAXRSS);
>
> Simply adding the appropriate calls to PerlMem_free at the exit  
> point seems to have fixed the problem.


Thank you! I was hoping it was something that simple.  I'll get your  
fix checked in soonish.

________________________________________
Craig A. Berry
mailto:[email protected]

"... getting out of a sonnet is much more
  difficult than getting in."
                  Brad Leithauser