knoaman 2003/03/04 13:11:12 Modified: c/src/xercesc/util EncodingValidator.cpp EncodingValidator.hpp c/src/xercesc/util/regx RangeTokenMap.cpp RangeTokenMap.hpp TokenFactory.cpp TokenFactory.hpp Log: [Bug 17516] Thread safety problems in ../util/ and ../util/regx. Revision Changes Path 1.3 +3 -2 xml-xerces/c/src/xercesc/util/EncodingValidator.cpp Index: EncodingValidator.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/EncodingValidator.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- EncodingValidator.cpp 4 Nov 2002 15:22:03 -0000 1.2 +++ EncodingValidator.cpp 4 Mar 2003 21:11:12 -0000 1.3 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.3 2003/03/04 21:11:12 knoaman + * [Bug 17516] Thread safety problems in ../util/ and ../util/regx. + * * Revision 1.2 2002/11/04 15:22:03 tng * C++ Namespace Support. * @@ -93,8 +96,6 @@ delete fEncodingRegistry; fEncodingRegistry = 0; - - fInstance = 0; } // --------------------------------------------------------------------------- 1.3 +2 -6 xml-xerces/c/src/xercesc/util/EncodingValidator.hpp Index: EncodingValidator.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/EncodingValidator.hpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- EncodingValidator.hpp 4 Nov 2002 15:22:03 -0000 1.2 +++ EncodingValidator.hpp 4 Mar 2003 21:11:12 -0000 1.3 @@ -76,11 +76,6 @@ class XMLUTIL_EXPORT EncodingValidator { public: - // ----------------------------------------------------------------------- - // Constructors and destructors - // ----------------------------------------------------------------------- - ~EncodingValidator(); - // ----------------------------------------------------------------------- // Validation methods // ----------------------------------------------------------------------- @@ -101,6 +96,7 @@ // Constructor and destructors // ----------------------------------------------------------------------- EncodingValidator(); + ~EncodingValidator(); // ----------------------------------------------------------------------- // Private Helpers methods 1.3 +22 -14 xml-xerces/c/src/xercesc/util/regx/RangeTokenMap.cpp Index: RangeTokenMap.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/regx/RangeTokenMap.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- RangeTokenMap.cpp 4 Nov 2002 15:17:00 -0000 1.2 +++ RangeTokenMap.cpp 4 Mar 2003 21:11:12 -0000 1.3 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.3 2003/03/04 21:11:12 knoaman + * [Bug 17516] Thread safety problems in ../util/ and ../util/regx. + * * Revision 1.2 2002/11/04 15:17:00 tng * C++ Namespace Support. * @@ -131,7 +134,7 @@ // RangeTokenMap: Constructors and Destructor // --------------------------------------------------------------------------- RangeTokenMap::RangeTokenMap() : - fRegistryInitialized(0) + fRegistryInitialized(false) , fTokenRegistry(0) , fRangeMap(0) , fCategories(0) @@ -152,8 +155,6 @@ delete fTokenFactory; fTokenFactory = 0; - - fInstance = 0; } // --------------------------------------------------------------------------- @@ -168,7 +169,6 @@ if (!fTokenRegistry->containsKey(keyword)) return 0; - RangeTokenElemMap* elemMap = 0; // Use a faux scope to synchronize while we do this @@ -265,16 +265,22 @@ // --------------------------------------------------------------------------- void RangeTokenMap::initializeRegistry() { - XMLMutexLock lockInit(&fMutex); + if (fRegistryInitialized) + return; - if (fRegistryInitialized) - return; + // Use a faux scope to synchronize while we do this + { + XMLMutexLock lockInit(&fMutex); - fTokenFactory = new TokenFactory(); - fTokenRegistry = new RefHashTableOf<RangeTokenElemMap>(109); - fRangeMap = new RefHashTableOf<RangeFactory>(29); - fCategories = new XMLStringPool(); - fRegistryInitialized = true; + if (!fRegistryInitialized) + { + fTokenFactory = new TokenFactory(); + fTokenRegistry = new RefHashTableOf<RangeTokenElemMap>(109); + fRangeMap = new RefHashTableOf<RangeFactory>(29); + fCategories = new XMLStringPool(); + fRegistryInitialized = true; + } + } } @@ -303,8 +309,10 @@ // Notification that lazy data has been deleted // ----------------------------------------------------------------------- void RangeTokenMap::reinitInstance() { - delete fInstance; - fInstance = 0; + + delete fInstance; + fInstance = 0; + TokenFactory::fRangeInitialized = false; } XERCES_CPP_NAMESPACE_END 1.3 +2 -6 xml-xerces/c/src/xercesc/util/regx/RangeTokenMap.hpp Index: RangeTokenMap.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/regx/RangeTokenMap.hpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- RangeTokenMap.hpp 4 Nov 2002 15:17:00 -0000 1.2 +++ RangeTokenMap.hpp 4 Mar 2003 21:11:12 -0000 1.3 @@ -112,11 +112,6 @@ class XMLUTIL_EXPORT RangeTokenMap { public: - // ----------------------------------------------------------------------- - // Constructors and destructors - // ----------------------------------------------------------------------- - virtual ~RangeTokenMap(); - // ----------------------------------------------------------------------- // Putter methods // ----------------------------------------------------------------------- @@ -152,6 +147,7 @@ // Constructor and destructors // ----------------------------------------------------------------------- RangeTokenMap(); + ~RangeTokenMap(); // ----------------------------------------------------------------------- // Getter methods 1.5 +42 -32 xml-xerces/c/src/xercesc/util/regx/TokenFactory.cpp Index: TokenFactory.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/regx/TokenFactory.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- TokenFactory.cpp 24 Dec 2002 17:59:07 -0000 1.4 +++ TokenFactory.cpp 4 Mar 2003 21:11:12 -0000 1.5 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.5 2003/03/04 21:11:12 knoaman + * [Bug 17516] Thread safety problems in ../util/ and ../util/regx. + * * Revision 1.4 2002/12/24 17:59:07 tng * Build with ICU 2.4 * @@ -111,12 +114,13 @@ XERCES_CPP_NAMESPACE_BEGIN +bool TokenFactory::fRangeInitialized = false; + // --------------------------------------------------------------------------- // TokenFactory: Constructors and Destructor // --------------------------------------------------------------------------- TokenFactory::TokenFactory() : - fRangeInitialized(0) - , fTokens(new RefVectorOf<Token> (16, true)) + fTokens(new RefVectorOf<Token> (16, true)) , fEmpty(0) , fLineBegin(0) , fLineBegin2(0) @@ -432,40 +436,46 @@ // --------------------------------------------------------------------------- void TokenFactory::initializeRegistry() { - XMLMutexLock lockInit(&fMutex); - if (fRangeInitialized) return; - RangeTokenMap::instance()->initializeRegistry(); + // Use a faux scope to synchronize while we do this + { + XMLMutexLock lockInit(&fMutex); + + if (!fRangeInitialized) { + + RangeTokenMap::instance()->initializeRegistry(); + + // Add categories + RangeTokenMap::instance()->addCategory(fgXMLCategory); + RangeTokenMap::instance()->addCategory(fgASCIICategory); + RangeTokenMap::instance()->addCategory(fgUnicodeCategory); + RangeTokenMap::instance()->addCategory(fgBlockCategory); + + // Add xml range factory + RangeFactory* rangeFact = new XMLRangeFactory(); + RangeTokenMap::instance()->addRangeMap(fgXMLCategory, rangeFact); + rangeFact->initializeKeywordMap(); + + // Add ascii range factory + rangeFact = new ASCIIRangeFactory(); + RangeTokenMap::instance()->addRangeMap(fgASCIICategory, rangeFact); + rangeFact->initializeKeywordMap(); + + // Add unicode range factory + rangeFact = new UnicodeRangeFactory(); + RangeTokenMap::instance()->addRangeMap(fgUnicodeCategory, rangeFact); + rangeFact->initializeKeywordMap(); + + // Add block range factory + rangeFact = new BlockRangeFactory(); + RangeTokenMap::instance()->addRangeMap(fgBlockCategory, rangeFact); + rangeFact->initializeKeywordMap(); - // Add categories - RangeTokenMap::instance()->addCategory(fgXMLCategory); - RangeTokenMap::instance()->addCategory(fgASCIICategory); - RangeTokenMap::instance()->addCategory(fgUnicodeCategory); - RangeTokenMap::instance()->addCategory(fgBlockCategory); - - // Add xml range factory - RangeFactory* rangeFact = new XMLRangeFactory(); - RangeTokenMap::instance()->addRangeMap(fgXMLCategory, rangeFact); - rangeFact->initializeKeywordMap(); - - // Add ascii range factory - rangeFact = new ASCIIRangeFactory(); - RangeTokenMap::instance()->addRangeMap(fgASCIICategory, rangeFact); - rangeFact->initializeKeywordMap(); - - // Add unicode range factory - rangeFact = new UnicodeRangeFactory(); - RangeTokenMap::instance()->addRangeMap(fgUnicodeCategory, rangeFact); - rangeFact->initializeKeywordMap(); - - // Add block range factory - rangeFact = new BlockRangeFactory(); - RangeTokenMap::instance()->addRangeMap(fgBlockCategory, rangeFact); - rangeFact->initializeKeywordMap(); - - fRangeInitialized = true; + fRangeInitialized = true; + } + } } /* 1.3 +6 -5 xml-xerces/c/src/xercesc/util/regx/TokenFactory.hpp Index: TokenFactory.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/regx/TokenFactory.hpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- TokenFactory.hpp 4 Nov 2002 15:17:00 -0000 1.2 +++ TokenFactory.hpp 4 Mar 2003 21:11:12 -0000 1.3 @@ -153,6 +153,7 @@ * objects. */ void initializeRegistry(); + friend class RangeTokenMap; // ----------------------------------------------------------------------- // Private data members @@ -164,8 +165,8 @@ // fToken // Contains user created Token objects. Used for memory cleanup. // ----------------------------------------------------------------------- - bool fRangeInitialized; - XMLMutex fMutex; + static bool fRangeInitialized; + XMLMutex fMutex; RefVectorOf<Token>* fTokens; Token* fEmpty; Token* fLineBegin; @@ -179,8 +180,8 @@ Token* fWordEnd; Token* fWordBegin; Token* fDot; - Token* fCombiningChar; - Token* fGrapheme; + Token* fCombiningChar; + Token* fGrapheme; }; XERCES_CPP_NAMESPACE_END
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]