[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