Skip Menu |

This queue is for tickets about the URI-Escape-XS CPAN distribution.

Report information
The Basics
Id: 57168
Status: resolved
Priority: 0/
Queue: URI-Escape-XS

People
Owner: Nobody in particular
Requestors: stephane.raux [...] linkfluence.net
Cc:
AdminCc:

Bug Information
Severity: (no value)
Broken in: (no value)
Fixed in: (no value)



CC: Franck Cuny <franck.cuny [...] linkfluence.net>, Camille Maussang <camille.maussang [...] linkfluence.net>
Subject: memory leak in uri_escape ?
Date: Mon, 03 May 2010 15:14:55 +0200
To: bug-URI-Escape-XS [...] rt.cpan.org
From: Stephane Raux <stephane.raux [...] linkfluence.net>
Hi, I am having an intensive use of uri_escape and it seems that it may have a memory leak. I performed the following test on latest version (0.06) : when running on my computer, the memory usage increases continuously. Here is the test : -------- use strict; use warnings; use URI::Escape::XS qw( uri_escape ); my $nb = 5000000; my $uri = "http://foo.bar.com/"; for( my $i=0; $i < $nb; ++$i ) { uri_escape( $uri ); } And here is my perl configuration : Summary of my perl5 (revision 5 version 10 subversion 0) configuration: Platform: osname=linux, osvers=2.6.24-23-server, archname=i486-linux-gnu-thread-multi uname='linux vernadsky 2.6.24-23-server #1 smp wed apr 1 22:22:14 utc 2009 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.0 -Dsitearch=/usr/local/lib/perl/5.10.0 -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.0 -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 -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 -I/usr/local/include' ccversion='', gccversion='4.4.1', 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 =' -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.10.1.so, so=so, useshrplib=true, libperl=libperl.so.5.10.0 gnulibc_version='2.10.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' Characteristics of this binary (from libperl): Compile-time options: MULTIPLICITY PERL_DONT_CREATE_GVSV PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP USE_ITHREADS USE_LARGE_FILES USE_PERLIO USE_REENTRANT_API Built under linux Compiled at Oct 1 2009 22:19:26 Regards, Stéphane Raux
Thanks for your report. Memory leak found and fixed. It was due to the fact that temporary SV was not released. The following patch will fix it. You can apply that or wait for VERSION++. Dan the Maintainer Thereof diff -u -r0.4 XS.xs --- XS.xs 2009/10/07 11:40:30 0.4 +++ XS.xs 2010/05/04 05:54:48 @@ -41,7 +41,7 @@ U8 *src, *dst; int i; if (sstr == &PL_sv_undef) return newSV(0); - str = newSVsv(sstr); /* make a copy to make func($1) work */ + str = sv_2mortal(newSVsv(sstr)); /* make a copy to make func($1) work */ slen = SvPOK(str) ? SvCUR(str) : 0; dlen = 0; result = newSV(slen * 3 + 1); /* at most 3 times */ @@ -71,7 +71,7 @@ int i, hi, lo; if (suri == &PL_sv_undef) return newSV(0); /* if (!SvPOK(suri)) return newSV(0); */ - uri = newSVsv(suri); /* make a copy to make func($1) work */ + uri = sv_2mortal(newSVsv(suri)); /* make a copy to make func($1) work */ slen = SvPOK(uri) ? SvCUR(uri) : 0; dlen = 0; result = newSV(slen + 1); @@ -132,6 +132,7 @@ dst[dlen++] = src[i]; } } + dst[dlen] = '\0'; /* for sure; */ SvCUR_set(result, dlen); return result; On Mon May 03 09:15:24 2010, stephane.raux@linkfluence.net wrote: Show quoted text
> Hi, > > I am having an intensive use of uri_escape and it seems that it may have > a memory leak. > I performed the following test on latest version (0.06) : when running > on my computer, the memory usage increases continuously. > > Here is the test : > -------- > use strict; > use warnings; > > use URI::Escape::XS qw( uri_escape ); > > my $nb = 5000000; > > my $uri = "http://foo.bar.com/"; > > for( my $i=0; $i < $nb; ++$i ) { > uri_escape( $uri ); > } > > And here is my perl configuration : > > Summary of my perl5 (revision 5 version 10 subversion 0) configuration: > Platform: > osname=linux, osvers=2.6.24-23-server, > archname=i486-linux-gnu-thread-multi > uname='linux vernadsky 2.6.24-23-server #1 smp wed apr 1 22:22:14 > utc 2009 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.0 > -Dsitearch=/usr/local/lib/perl/5.10.0 -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.0 -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 -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 -I/usr/local/include' > ccversion='', gccversion='4.4.1', 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 =' -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.10.1.so, so=so, useshrplib=true, > libperl=libperl.so.5.10.0 > gnulibc_version='2.10.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' > > > Characteristics of this binary (from libperl): > Compile-time options: MULTIPLICITY PERL_DONT_CREATE_GVSV > PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP USE_ITHREADS > USE_LARGE_FILES USE_PERLIO USE_REENTRANT_API > Built under linux > Compiled at Oct 1 2009 22:19:26 > > Regards, > > Stéphane Raux >