Hi Suzanne,

No, static iniitialization in Xalan is never thread-safe.  You should call
it once from the main thread, before any other threads start.  If it's not
documented as such, that's a documentation bug, and should be fixed.

The crash is because Xalan does some initialization of static data itself,
which requires transcoding.  Most of this is removed in newer versions of
Xalan, but some is still there.

Note that the Xerces initialization function PlatformUtils::Initialize()
has the same limitation.

Dave



                                                                                       
                                  
                      Suzanne Dirkers                                                  
                                  
                      <[EMAIL PROTECTED]         To:      [EMAIL PROTECTED]            
                             
                      com>                     cc:      (bcc: David N 
Bertoni/Cambridge/IBM)                             
                                               Subject: XPathEvaluator::initialize()   
                                  
                      03/26/2003 12:49                                                 
                                  
                      PM                                                               
                                  
                      Please respond                                                   
                                  
                      to xalan-dev                                                     
                                  
                                                                                       
                                  







      Hi ,

                        Is XPathEvaluator::initialize() supposed to be
thread-safe if you call it in each thread after
XMLPlatformUtils::Initialize() similar to how SImpleXPathAPI does it?     I
find that if I try to run an application that is essentially SimpleXPathAPI
logic being called independently for each one  within a set of multiple
threads (no, they are NOT using the same objects, that I know of), if I try
it with more than 2 threads, I end up with a protection exception on a call
stack that look like this:

     0C3239C0  +00000072  XMLString::transcode(const char* const,unsigned
short* const
                                                               0C3239C0
+00000072              *PATHNAM           Exception
    0C843C98                0B624018  +000001C2  doXercesTranscode(const
char*,unsigned int,int,vector<unsign
                                                               0B624018
+000001C2              *PATHNAM           Call
    0C843BB0                0B6245E8  +0000015A
doTranscodeFromLocalCodePage(const char*,unsigned int,int,ve
                                                               0B6245E8
+0000015A              *PATHNAM           Call
    0C8439D8                0B626A40  +00000164
XalanDOMString::append(const char*,unsigned int)
                                                               0B626A40
+00000164              *PATHNAM           Call
    0C8438F8                0B625810  +0000009A
XalanDOMString::XalanDOMString(const char*,unsigned int)
                                                               0B625810
+0000009A              *PATHNAM           Call
    0C8437C8                0B649C10  +00000082
DOMStringHelperInitialize()
                                                               0B649C10
+00000082              *PATHNAM           Call
    0C8436F0                0B65D388  +000000A8
PlatformSupportInit::PlatformSupportInit()
                                                               0B65D388
+000000A8              *PATHNAM           Call
    0C843618                0B7DB0D0  +00000078  XPathInit::XPathInit()
                                                               0B7DB0D0
+00000078              *PATHNAM           Call
    0C843540                0B7BB1C0  +00000092
XPathEvaluator::initialize()
                                                               0B7BB1C0
+00000092              *PATHNAM

       One question I have is: what is the transcode trying to work on?
XPathEvaluator::initialize() never had any arguments from anything I passed
into it.

       Is it possible that DOMStringHelperInitialize() is trying to work
with something global that is not set up separately for each thread and
then trying to do a TranscodeFromLocalCodePage on it?

        How does one assure that the XPathEvaluator::initialize() is
properly set up for multi-threading?

Thanks,
Suzanne



Reply via email to