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:
#define PERL_NO_GET_CONTEXT
sv_foo(a, b, c);
On a threaded/MULTIPLICITY build, it would macro-expand to:
Perl_sv_foo(my_perl, 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(((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
PerlInterpreter * my_perl =
(PerlInterpreter *)pthread_getspecific(PL_thr_key);
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);
Dave. |