James Scott Boorn wrote:
> 
> I noticed that when I run the straight c version (m.c below) that at
> malloc.c:2679 (from glibc-2.1.3-21.src.rpm from RedHat) that
> __malloc_hook has a nonnull value.  But the in the .so version loaded by
> perl (TT.xs below compiled to .so) __malloc_hook is null.  What do I
> need to do to get __malloc_hook defined in the .so version?
> 
> Thank You,
> James
> 
> James Scott Boorn wrote:
> 
> > > > > I suspect I am not linking properly.  The symptom is that malloc/free
> > > > > does not seem to behave in a thread safe manner.  In a XS module the
> > > > > code uses the pthread library to create a couple of threads, in the
> > > > > threads lots of mallocs and frees are performed.  The code will fail
> > > > > from Segmentation fault.  The sample code attached behaves the same on
> > > > > two
> > > > > differt machines.  The first is a dual cpu x86 box running RedHat 6.0
> > > > > Linux with a hand build kernel 2.2.16, perl rpm is perl-5.00503-11, and
> > > > > glibc rpm is glibc-2.1.3-21.  The second machine is a dual cpu x86 box
> > > > > running RedHat 6.1 Linux, stock kernel 2.2.12-20smp, perl
> > > > > perl-5.00503-11, and glibc-2.1.2-11.
> > > > >
> > > > > To compile edit makefile and type make.  Run test with 'perl test.pl'.
> > > > >
> > > > > Thanks,
> > > > > James Boorn
> >Here is build output:
> >
> > perl /usr/lib/perl5/5.00503/ExtUtils/xsubpp -typemap
> > /usr/lib/perl5/5.00503/ExtUtils/typemap TT.xs > TT.c
> > Please specify prototyping behavior for TT.xs (see perlxs manual)
> > cc -D_POSIX_REENTRANT_FUNCTIONS -DREENTRANT -g -Wall
> > -I/usr/lib/perl5/5.00503/i386-linux/CORE -c TT.c
> > TT.c: In function `boot_TT':
> > TT.c:81: warning: unused variable `items'
> > cc -Wl,-G -o TT.so TT.o -lpthread
> >
> > I tried changing  -lpthread to -pthread, no difference.  Also note the c
> > program below does the same thing, but works fine.  So I think it has
> > something to do with the fact that the perl module is dynamically
> > loaded, but I don't know how to figure out what is different at runtime
> > to fix it.
> >
> > This c program works (compile with 'cc -D_POSIX_REENTRANT_FUNCTIONS
> > -DREENTRANT -g -o m m.c -lpthread')
> >
> > #include <stdio.h>
> > #include <pthread.h>
> >
> > #define TESTSTRING "This is a test.  I am ok."
> >
> > void foo(void *arg) {
> >     char *bar;
> >     int i, j, x;
> >
> >     for (i = 0; i < 1000000; ++i) {
> >         bar = (char*)malloc(26 * sizeof(char));
> >         strcpy(bar, TESTSTRING);
> >         for (x = 0, j = 0; j < 1000; ++j) {
> >             x += j;
> >         }
> >         if (strcmp(bar, TESTSTRING)) {
> >             printf("bar is %s, i = %d\n", bar, i);
> >         }
> >         free(bar);
> >     }
> > }
> >
> > int main(int argc, char **argv) {
> >     pthread_t *threads;
> >     int i, tc = 2;
> >
> >     if (argc > 1) {
> >         tc = atoi(argv[1]);
> >         if (tc < 1) return -1;
> >     }
> >     printf ("tc is %d\n", tc);
> >     threads = (pthread_t*)malloc(tc * sizeof(pthread_t));
> >     for (i = 0; i < tc; ++i) {
> >         pthread_create(&threads[i], NULL, (void*)foo, NULL);
> >     }
> >
> >     for (i = 0; i < tc; ++i) {
> >         pthread_join(threads[i], NULL);
> >     }
> >
> >     return 0;
> > }
> >
> > This perl code does not work (3 source file TT.xs TT.pm test.pl, after
> > compiling TT.xs run 'perl test.pl')
> >
> > /**** TT.xs compile with:
> > perl /usr/lib/perl5/5.00503/ExtUtils/xsubpp -typemap
> > /usr/lib/perl5/5.00503/ExtUtils/typemap TT.xs > TT.c
> > gcc -D_POSIX_REENTRANT_FUNCTIONS -DREENTRANT -g -Wall
> > -I/usr/lib/perl5/5.00503/i386-linux/CORE -c TT.c
> > gcc -Wl,-G -o TT.so TT.o -lpthread
> > ****/
> > #include <stdio.h>
> > #include <pthread.h>
> >
> > typedef unsigned char bool;
> > #include "EXTERN.h"
> > #include "perl.h"
> > #include "XSUB.h"
> >
> > #ifdef __cplusplus
> > extern "C" {
> > #endif
> >
> > #define TESTSTRING "This is a test.  I am ok."
> >
> > void foo(void *arg) {
> >     char *bar;
> >     int i, j, x;
> >
> >     for (i = 0; i < 1000000; ++i) {
> >         bar = (char*)malloc(26 * sizeof(char));
> >         strcpy(bar, TESTSTRING);
> >         for (x = 0, j = 0; j < 1000; ++j) {
> >             x += j;
> >         }
> >         if (strcmp(bar, TESTSTRING)) {
> >             printf("bar is %s, i = %d\n", bar, i);
> >         }
> >         free(bar);
> >     }
> > }
> >
> > int tt_run() {
> >     pthread_t *threads;
> >     int i, tc = 2;
> >
> >     printf ("tc is %d\n", tc);
> >     threads = (pthread_t*)malloc(tc * sizeof(pthread_t));
> >     for (i = 0; i < tc; ++i) {
> >         pthread_create(&threads[i], NULL, (void*)foo, NULL);
> >     }
> >
> >     for (i = 0; i < tc; ++i) {
> >         pthread_join(threads[i], NULL);
> >     }
> >
> >     return 0;
> > }
> >
> > #ifdef __cplusplus
> > }
> > #endif
> >
> > MODULE = TT     PACKAGE = TT    PREFIX = TT_
> >
> > void
> > TT_doit ()
> >     CODE:
> >         tt_run();
> >
> > ##TT.pm
> > package TT;
> >
> > use Exporter;
> > use DynaLoader;
> >
> > BEGIN {
> >     $VERSION = '0.01';
> >     @ISA = qw(Exporter DynaLoader);
> >     bootstrap TT $VERSION;
> > }
> >
> > 1;
> >
> > ##test.pl
> > use TT;
> >
> > TT::doit();
> 
> here is the makefile
> PERLEXUTILS=/usr/lib/perl5/5.00503/ExtUtils
> PERLINC=/usr/lib/perl5/5.00503/i386-linux/CORE
> 
> all: TT.so m
> 
> m: m.c
>         cc -D_POSIX_REENTRANT_FUNCTIONS -DREENTRANT -g -Wall -o m m.c -lpthread
> 
> TT.so: TT.o
>         cc -Wl,-G -o TT.so TT.o -lpthread
> 
> TT.o: TT.c
>         cc -D_POSIX_REENTRANT_FUNCTIONS -DREENTRANT -g -Wall -I$(PERLINC) -c
> TT.c
> 
> TT.c: TT.xs
>         perl $(PERLEXUTILS)/xsubpp -typemap $(PERLEXUTILS)/typemap TT.xs > TT.c
> 
> clean:
>         rm -f TT.so TT.o TT.c core m

Reply via email to