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:craigbe...@mac.com

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

Reply via email to