in reply to Re: XS: Passing an external library's function a Perl XS callback
in thread SOLVED: XS: Passing an external library's function a Perl XS callback

I see where you declare PerlInterpreter *mine to hold the Perl context, but where you assign it?

In his linked example, BrowserUk has:

void setCallback( SV *cb1, SV* cb2, SV *cb3, SV *cb4 ) { saved = Perl_get_context();

but I don't see an equivalent in your code.

Replies are listed 'Best First'.
Re^3: XS: Passing an external library's function a Perl XS callback
by pRiVi (Initiate) on Jan 06, 2019 at 00:05 UTC
    I can confirm that you have to run
    mine = Perl_get_context();
    before you can use this. The run of
    dSP;
    just segfaults if
    mine
    have not been set via
    mine = Perl_get_context();
    I call on initialisation of my module a XS function which does does do
    mine = Perl_get_context();
    and verify that mine is not NULL before trying to call a perl function.

    All I needed is the following to get it working, and call the function "functionname" within of the module I called "setcallback" from.
    The use in C:
    void dorunperlfunction() { if (mine) { PERL_SET_CONTEXT(mine); dSP; ENTER; SAVETMPS; PUSHMARK(SP); PUTBACK; call_pv("functionname", G_DISCARD|G_NOARGS); FREETMPS; LEAVE; }
    The initialisation in XS(!):
    PerlInterpreter * mine = NULL; ... void setcallback() CODE: ... mine = Perl_get_context(); ...