void SWIG_Wrap_callback(int event, tMy_MSG *p_data) { printf("entering perl callback handler...\n"); dTHX; /*Not sure this is needed, but doesnt make any difference */ if ( my_perl != NULL ) printf ("my_perl == %ul\n", my_perl); else printf ("my_perl == NULL\n"); /* This line is printed*/ PERL_SET_CONTEXT(my_perl); /* Not sure this is needed, but tried in vain */ printf("dTHX done...\n"); dSP; /* Crashes here */ printf("Destruct level : %d...\n", PL_perl_destruct_level); /* "0" (ZERO) is printed under the scenario where callback invokation works. Does it mean perl is not built correctly per my needs?? */ printf("DSP done...\n"); SV * sv = bsa_perl_disc_callback; if (sv == (SV*)NULL) croak("Internal error...\n"); printf("Preparing to call perl callback...\n"); PUSHMARK(SP); XPUSHs(sv_2mortal(newSViv(event))); printf("newSViv of %d done...\n", event); XPUSHs(SWIG_NewPointerObj(SWIG_as_voidptr(p_data), SWIGTYPE_p_tMy_MSG, SWIG_SHADOW)); printf("newSVsv...\n"); PUTBACK; printf("calling the Perl sub...\n"); /* Call the Perl sub */ call_sv(sv, G_DISCARD); printf("Perl sub completed successfully...\n"); }