[Bangalore-pm] Multiple perl interpreters : how to use correctly

Sri w2learn at yahoo.com
Tue Nov 3 02:34:36 PST 2009


Hi,

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).  The library 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.  If anyone has pointers or other forums that may specialize in this topic, it would be great help.

---using perl 5.8.8, compiled with multiplicity, default_context etc---

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



      


More information about the Bangalore-pm mailing list