in reply to Re^2: Significance of #define PERL_GET_NO_CONTEXT in XS
in thread Significance of #define PERL_NO_GET_CONTEXT in XS
Or just define PERL_GET_NO_CONTEXT, and not concern ourselves with whether perl was even built with "usemultiplicity"That's the thing to do. On unthreaded builds etc, the macros will all just Do The Right Thing (which is usually to do nothing).
To further elaborate, consider the following snippet of XS code:
On a threaded/MULTIPLICITY build, it would macro-expand to:#define PERL_NO_GET_CONTEXT sv_foo(a, b, c);
Remove the PERL_NO_GET_CONTEXT and, depending on platform (this is Linux), it might expand to something like:Perl_sv_foo(my_perl, a, b, c);
Perl_sv_foo(((PerlInterpreter *)pthread_getspecific(PL_thr_key)), a, b, c);
On a non-threaded build, it would expand to the following, regardless of whether PERL_NO_GET_CONTEXT is present:
Perl_sv_foo(a, b, c);
The dTHX macro basically expands to
So it's more efficient to just calculate my_perl once per function rather than for every function call, but it's even better to get your caller to pass it to you. So declare your functions as say Foo(pTHX_ int a, int b) and call them as Foo(aTHX_ 1, 2);PerlInterpreter * my_perl = (PerlInterpreter *)pthread_getspecific(PL_thr_key);
Dave.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: Significance of #define PERL_GET_NO_CONTEXT in XS
by syphilis (Archbishop) on Mar 14, 2014 at 13:57 UTC |