memory leak in DBI XS bootstrap code



I am experiencing what I believe to be a memory leak in the DBI bootstrap code. This is a problem for me because I am embedding perl in a long-running program, and DBI is being loaded over and over, so my program grows and grows.

The problem appears to be in the following routines:

boot_DBI (in /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi/auto/DBI/DBI.so)
XS_DBI__install_method (in /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi/auto/DBI/DBI.so)

I am using DBI 1.51

The tool "valgrind" (http://valgrind.org) can be used to reproduce the leak using the following code:

---
File: embed_test.c
---

#include <EXTERN.h> /* from the Perl distribution */
#include <perl.h> /* from the Perl distribution */

static PerlInterpreter *my_perl; /*** The Perl interpreter ***/
EXTERN_C void xs_init (pTHX); /*** init dyn. loading ***/

int main(int argc, char **argv, char **env)
{
char *embedding[] = { "", "-e", "0" };
my_perl = perl_alloc();
perl_construct(my_perl);
perl_parse(my_perl, xs_init, 3, embedding, (char **)NULL);
PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
perl_run(my_perl);
eval_pv("use DBI", TRUE);
perl_destruct(my_perl);
perl_free(my_perl);
}

---
File: Makefile
---

CC_OPTS = $(shell perl -MExtUtils::Embed -e ccopts)
LD_OPTS = $(shell perl -MExtUtils::Embed -e ldopts)

EXE = embed_test

$(EXE): xsinit.o embed_test.o
gcc -o $(EXE) embed_test.o xsinit.o $(LD_OPTS)

embed_test.o: embed_test.c
gcc -c embed_test.c $(CC_OPTS)

xsinit.o: xsinit.c
gcc -c xsinit.c $(CC_OPTS)

xsinit.c:
perl -MExtUtils::Embed -e xsinit -- -o xsinit.c

clean:
rm -f *.o xsinit.c $(EXE)

---
EOF
---

Can anyone suggest a fix for this? I'd be more than willing to take a patch to DBI 1.51 as soon as someone has one.

Thanks,
Ephraim Dan



Relevant Pages