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]