Bjoern Hoehrmann <[EMAIL PROTECTED]> writes:
>* 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.

Sounds Ok.

>
>Is there a simple method to actually test whether there would be major
>issues when using the module in some multi-threaded Perl environment?

Not that I can think of.

>
>>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 :-)

The actual implementation of how dTHX gets the pointer 
depends on the host OS. 

>
>>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.

Sounds good.


>
>Thanks!

Reply via email to