#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" #include static PerlInterpreter *orig_perl=NULL; static PerlInterpreter *cb_perl=NULL; SV* cb_ptr = NULL; void InvokeCB () { static int val = 0; val++; dTHX; dSP; ENTER; SAVETMPS; PUSHMARK(SP); SV * sv = cb_ptr; if (my_perl != orig_perl) { CLONE_PARAMS clone_param; clone_param.stashes = NULL; clone_param.flags = CLONEf_COPY_STACKS | CLONEf_KEEP_PTR_TABLE; clone_param.proto_perl = cb_perl; sv = sv_dup(sv, &clone_param); } XPUSHs(sv_2mortal(newSViv(val))); PUTBACK; call_sv(sv, G_DISCARD); FREETMPS; LEAVE; } void * BGThread(void * dontcare) { PERL_SET_CONTEXT(orig_perl); cb_perl = perl_clone(orig_perl, CLONEf_COPY_STACKS | CLONEf_KEEP_PTR_TABLE); PERL_SET_CONTEXT(cb_perl); while (1) { sleep(5); InvokeCB(); } } MODULE = myModule PACKAGE = myModule int RegisterCB (SV *SubRef) CODE: pthread_t tid; pthread_create(&tid, NULL, BGThread, NULL); orig_perl = PERL_GET_CONTEXT; cb_ptr = newSVsv(SubRef); SvSHARE(cb_ptr); RETVAL = 1; OUTPUT: RETVAL