* Nick Ing-Simmons wrote:
>> http://search.cpan.org/src/BJOERN/SGML-Parser-OpenSP-0.02/OpenSP.xs
>>is a C++ XS extension. I am trying to figure out what is needed, if
>>anything, to make it play nicely in the context of multiple threads.
>
>The MOST important thing is to make sure your XS code and any library
>code it calls is ready for threads. That means no static variables
>without MUTEX exclusion and all the usual thready things.
I am mostly concerned about understanding best practise in this regard
as the documentation is not all that clear to me; my understanding for
the specific module is that the library is said to be thread-safe and
the only global variables in my extensions are some static U32 values
which are initialized in the constructor using PERL_HASH(...) and then
never changed, so from that I would say the code is ready for threads.
Is there a simple method to actually test whether there would be major
issues when using the module in some multi-threaded Perl environment?
>Probably true, but any sane callback scheme will pass some
>"user data" pointer to the C function. You can put the interpreter
>pointer in that if you want to go to extreams.
For C++ `this` would always be passed so there is generally no need to
pass user data around. I did not think about this here as perlguts does
not discuss the actual implementation in the relevant section hence I
considered that to be something I am not supposed to know and assumed
magic :-)
>class PerlBase {
>...
>private:
> PerlInterpreter *my_perl;
>...
>};
>Perhaps a constructor like:
>
> PerlBase(pTHX) { this->my_perl = my_perl; }
>
>is all it needs ???
Makes sense to me! I tried that, I've changed all helper functions to
methods of the main class and added
...
#define PERL_NO_GET_CONTEXT
...
PerlInterpreter* my_perl;
...
and changed the constructor (adding the two lines) to
SgmlParserOpenSP::SgmlParserOpenSP()
{
dTHX;
this->my_perl = my_perl;
...
This compiles fine and all tests pass; Benchmark.pm tells me on Windows
2000 on a Intel Mobile Celeron 1066 with ActivePerl 5.8.2 and no thread
stuff involved for a 7,2 MB XML doc this version is about 10% faster.
Thanks!