I've posted an update/resolution reg this issue to perl5-porters.  FYI

http://markmail.org/message/cjbhybjfikuirvud

--- On Wed, 11/4/09, Sri <w2le...@yahoo.com> wrote:

> From: Sri <w2le...@yahoo.com>
> Subject: Using multiple perl interpreters
> To: modperl@perl.apache.org
> Date: Wednesday, November 4, 2009, 8:49 PM
> Hi,
> 
> I've read several posts on this forum on similar topic, but
> not able to figure out the problem in my specific case. So
> hoping someone can help me here.  Essentially, its a
> seg fault when using a thread-specific interpreter.
> 
> I'm trying to provide a Perl interface to a C library
> (event-driven).  The C library has APIs, ofcourse, but
> it also allows perl-subroutines to be registered as
> callbacks into the C library.  The C library has a
> thread that monitors external events and invokes the
> perl-sub callbacks.
> 
> The default perl interpreter is executing the script
> (interpreter instance one).  I do NOT have any code to
> create/initiaze this instance in my api
> wrappers.   My library's thread, creates a
> new interpreter.  But, crashes in the call_sv(). 
> If I execute the same code (call_handler below, unmodified)
> as part of an API call invoked from perl-script, it works
> just fine.  So, I feel I'm not initializing/using the
> 2nd instance correctly or "coordinating" between the two
> instances properly.  If anyone has pointers or other
> forums that may specialize in this topic, it would be great
> help.
> 
> I tried to use perl_clone instead of perl_alloc, but that
> method crashed too.
> 
> ---using perl 5.8.8, compiled with multiplicity, implicit
> context (see below)---
> 
> void mythread_fn(void)
> {
> 
>          static
> PerlInterpreter *my_perl=NULL;
> 
>          my_perl =
> perl_alloc();
>      
>    PERL_SET_CONTEXT(my_perl);
>      
>    perl_construct(my_perl);
>          perl_run(my_perl);
> 
>          while (1)
>          {
> 
>              /*
> monitor for events */
>              if
> (event == xyz)
>              
>    callback_handler(event);
>          }
> 
>         perl_destruct(my_perl);
>         perl_free(my_perl);
> }
> 
> void callback_handler(int event)
> {
>       dTHX;
>       dSP;
> 
>       ENTER;
>       SAVETMPS;
> 
>       SV * sv = disc_callback;  /*
> saved earlier in an API call */
>       if (sv == (SV*)NULL)
>          croak("Internal
> error...\n");
> 
>       PUSHMARK(SP);
>       XPUSHs(sv_2mortal(newSViv(event)));
>       PUTBACK;
> 
>       /* Call the Perl sub */
>       call_sv(sv, G_DISCARD);  /*
> crashes as shown below in gdb */
> 
>       FREETMPS;
>       LEAVE;
> }
> 
> Part of gdb stacktrace.
> 
> #0  Perl_pp_entersub (my_perl=0x6587b0) at
> pp_hot.c:2945
> #1  0x00000000004224f3 in S_call_body
> (my_perl=0x6587b0, myop=0x65a6e0,
>     is_eval=1 '\001') at perl.c:2728
> #2  0x00000000004223c4 in Perl_call_sv
> (my_perl=0x6587b0, sv=0x635420, flags=2)
>     at perl.c:2607
> 
> parts from perl -V
> 
>     cc='gcc', ccflags ='-D_REENTRANT
> -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBUGGING
> -fno-strict-aliasing -pipe -I/usr/local/include
> -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
> -I/usr/include/gdbm',
> 
> Characteristics of this binary (from libperl):
>   Compile-time options: DEBUGGING MULTIPLICITY
> PERL_IMPLICIT_CONTEXT
>                
>         PERL_MALLOC_WRAP
> THREADS_HAVE_PIDS USE_64_BIT_ALL
>                
>         USE_64_BIT_INT USE_ITHREADS
> USE_LARGE_FILES
>                
>         USE_PERLIO USE_REENTRANT_API
> 
> 
> 
> 
>       
> 



Reply via email to