From w2learn at yahoo.com Tue Nov 3 02:34:36 2009 From: w2learn at yahoo.com (Sri) Date: Tue, 3 Nov 2009 02:34:36 -0800 (PST) Subject: [Bangalore-pm] Multiple perl interpreters : how to use correctly Message-ID: <906783.17470.qm@web56505.mail.re3.yahoo.com> 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 From mkirank at gmail.com Tue Nov 3 08:07:59 2009 From: mkirank at gmail.com (Kiran Kumar) Date: Tue, 3 Nov 2009 10:07:59 -0600 Subject: [Bangalore-pm] Multiple perl interpreters : how to use correctly In-Reply-To: <906783.17470.qm@web56505.mail.re3.yahoo.com> References: <906783.17470.qm@web56505.mail.re3.yahoo.com> Message-ID: You can try posting this at perlmonks.org or another option would be via IRC at #perl channel or there are some helpful folks on irc://irc.perl.org/%23sdl . Is your perl built with thread support ? -Kiran On Tue, Nov 3, 2009 at 4:34 AM, Sri wrote: > 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 > > > > > _______________________________________________ > Bangalore-pm mailing list > Bangalore-pm at pm.org > http://mail.pm.org/mailman/listinfo/bangalore-pm > -------------- next part -------------- An HTML attachment was scrubbed... URL: