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

Reply via email to