Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Perl: porters

[perl #78224] Smart matching memmory leak

 

 

Perl porters RSS feed   Index | Next | Previous | View Threaded


perlbug-followup at perl

Oct 5, 2010, 11:11 AM

Post #1 of 3 (113 views)
Permalink
[perl #78224] Smart matching memmory leak

# New Ticket Created by mbyovev [at] windowslive
# Please include the string: [perl #78224]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=78224 >




This is a bug report for perl from mbyovev [at] windowslive,
generated with the help of perlbug 1.39 running under perl 5.10.1.

Hi,
It seems like perl 5.10 smart matching (operator ~~) is leaking memory
when comparing arrays.
Here is the proof code (linux):

#!/usr/bin/perl

my @a1=(0..10000);
my @a2=(0..10000);

foreach my $j(0..1000)
{
@a1 ~~ @a2;
#show my memory usage
system "cat /proc/$$/status | grep VmRSS";
}

If you run it you will see constant increase of memory used by the process
on each iteration of foreach loop.
Ammount of memory leaked is greater if arrays are equal. For example, if
elements with index 0 are not equal, leaked memmory is significantly
smaller compared with if all the elements of arrays are equal.
---
Flags:
category=core
severity=low
---
Site configuration information for perl 5.10.1:

Configured by Debian Project at Fri Apr 23 07:59:14 UTC 2010.

Summary of my perl5 (revision 5 version 10 subversion 1) configuration:

Platform:
osname=linux, osvers=2.6.24-27-server,
archname=i486-linux-gnu-thread-multi
uname='linux vernadsky 2.6.24-27-server #1 smp fri mar 12 01:45:06 utc
2010 i686 gnulinux '
config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN
-Dcccdlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr
-Dprivlib=/usr/share/perl/5.10 -Darchlib=/usr/lib/perl/5.10
-Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5
-Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local
-Dsitelib=/usr/local/share/perl/5.10.1
-Dsitearch=/usr/local/lib/perl/5.10.1 -Dman1dir=/usr/share/man/man1
-Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1
-Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl
-Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio -Uusenm
-DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib -Dlibperl=libperl.so.5.10.1
-Dd_dosuid -des'
hint=recommended, useposix=true, d_sigaction=define
useithreads=define, usemultiplicity=define
useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
use64bitint=undef, use64bitall=undef, uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN
-fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
optimize='-O2 -g',
cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing
-pipe -fstack-protector -I/usr/local/include'
ccversion='', gccversion='4.4.3', gccosandvers=''
intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t',
lseeksize=8
alignbytes=4, prototype=define
Linker and Libraries:
ld='cc', ldflags =' -fstack-protector -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib /usr/lib64
libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
perllibs=-ldl -lm -lpthread -lc -lcrypt
libc=/lib/libc-2.11.1.so, so=so, useshrplib=true,
libperl=libperl.so.5.10.1
gnulibc_version='2.11.1'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib
-fstack-protector'

Locally applied patches:


---
@INC for perl 5.10.1:
/etc/perl
/usr/local/lib/perl/5.10.1
/usr/local/share/perl/5.10.1
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.10
/usr/share/perl/5.10
/usr/local/lib/site_perl
.

---
Environment for perl 5.10.1:
HOME=/home/mby
LANG=bg_BG.UTF-8
LANGUAGE (unset)
LD_LIBRARY_PATH=/opt/e17/lib:$LD_LIBRARY_PATH
LOGDIR (unset)

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/e17/bin
PERL_BADLANG (unset)
SHELL=/bin/bash


davem at iabyn

Oct 26, 2010, 9:06 AM

Post #2 of 3 (95 views)
Permalink
Re: [perl #78224] Smart matching memmory leak [In reply to]

On Tue, Oct 05, 2010 at 11:11:01AM -0700, mbyovev [at] windowslive wrote:
> It seems like perl 5.10 smart matching (operator ~~) is leaking memory
> when comparing arrays.
> Here is the proof code (linux):
>
> #!/usr/bin/perl
>
> my @a1=(0..10000);
> my @a2=(0..10000);
>
> foreach my $j(0..1000)
> {
> @a1 ~~ @a2;
> #show my memory usage
> system "cat /proc/$$/status | grep VmRSS";
> }
>
> If you run it you will see constant increase of memory used by the process
> on each iteration of foreach loop.

Thanks for the report. This appears to have been fixed sometime between
5.11.0 and 5.11.3 (and thus in 5.12.0 too).

--
Little fly, thy summer's play my thoughtless hand
has terminated with extreme prejudice.
(with apologies to William Blake)


nick at ccl4

May 3, 2012, 2:32 AM

Post #3 of 3 (42 views)
Permalink
Re: [perl #78224] Smart matching memmory leak [In reply to]

On Tue, Oct 26, 2010 at 05:06:32PM +0100, Dave Mitchell wrote:
> On Tue, Oct 05, 2010 at 11:11:01AM -0700, mbyovev [at] windowslive wrote:
> > It seems like perl 5.10 smart matching (operator ~~) is leaking memory
> > when comparing arrays.
> > Here is the proof code (linux):
> >
> > #!/usr/bin/perl
> >
> > my @a1=(0..10000);
> > my @a2=(0..10000);
> >
> > foreach my $j(0..1000)
> > {
> > @a1 ~~ @a2;
> > #show my memory usage
> > system "cat /proc/$$/status | grep VmRSS";
> > }
> >
> > If you run it you will see constant increase of memory used by the process
> > on each iteration of foreach loop.
>
> Thanks for the report. This appears to have been fixed sometime between
> 5.11.0 and 5.11.3 (and thus in 5.12.0 too).

It was fixed by this commit

commit 6bc991bfb3c34a5d286a1202fcc0d740d72dcee7
Author: Rafael Garcia-Suarez <rgs [at] consttype>
Date: Mon Dec 7 13:55:49 2009 +0100

Allocate the right HV

This will solve an obscure bug in smart-match involving nested data
structures containing the same elements.

diff --git a/pp_ctl.c b/pp_ctl.c
index 68a42d7..b196640 100644
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -4313,7 +4313,7 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
(void) sv_2mortal(MUTABLE_SV(seen_this));
}
if (NULL == seen_other) {
- seen_this = newHV();
+ seen_other = newHV();
(void) sv_2mortal(MUTABLE_SV(seen_other));
}
for(i = 0; i <= other_len; ++i) {

Nicholas Clark

Perl porters RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.