void callp( ) { int new_perl = 0; dTHX; if ( my_perl != NULL ) printf ("my_perl == %ul\n", my_perl); else { printf ("my_perl was NULL\n"); PERL_SET_CONTEXT(mine); perl_for_cb = perl_clone(mine, CLONEf_KEEP_PTR_TABLE); PERL_SET_CONTEXT(perl_for_cb); // The following seems not necessary //CLONE_PARAMS clone_param; clone_param.stashes = NULL; clone_param.flags = 0; clone_param.proto_perl = perl_for_cb; new_perl = 1; } dSP; SV* callback = get_sv("MPV::Simple::callback",0); SV* data = get_sv("MPV::Simple::callback_data",0); ENTER; SAVETMPS; PUSHMARK(SP); EXTEND(SP,1); PUSHs(sv_2mortal(newSVsv(data))); PUTBACK; perl_call_sv(callback,G_DISCARD); SPAGAIN; PUTBACK;FREETMPS;LEAVE; // I don't know whether this is important if ( new_perl ) { perl_free(my_perl); PERL_SET_CONTEXT(mine); } } #### void _xs_set_wakeup_callback(MPV::Simple ctx, SV* callback) CODE: { void (*callp_ptr)(void*); callp_ptr = callp; mpv_set_wakeup_callback(ctx,callp_ptr,NULL); }