knoaman 2003/10/20 08:57:22
Modified: c/src/xercesc/validators/schema GeneralAttributeCheck.cpp
Log:
Fix multithreading problem.
Revision Changes Path
1.15 +25 -16
xml-xerces/c/src/xercesc/validators/schema/GeneralAttributeCheck.cpp
Index: GeneralAttributeCheck.cpp
===================================================================
RCS file:
/home/cvs/xml-xerces/c/src/xercesc/validators/schema/GeneralAttributeCheck.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- GeneralAttributeCheck.cpp 1 Oct 2003 16:32:41 -0000 1.14
+++ GeneralAttributeCheck.cpp 20 Oct 2003 15:57:22 -0000 1.15
@@ -56,6 +56,9 @@
/*
* $Log$
+ * Revision 1.15 2003/10/20 15:57:22 knoaman
+ * Fix multithreading problem.
+ *
* Revision 1.14 2003/10/01 16:32:41 neilg
* improve handling of out of memory conditions, bug #23415. Thanks to David
Cargill.
*
@@ -200,6 +203,14 @@
// ---------------------------------------------------------------------------
+// Static local data
+// ---------------------------------------------------------------------------
+static bool sGeneralAttCheckMutexRegistered = false;
+static XMLMutex* sGeneralAttCheckMutex = 0;
+static XMLRegisterCleanup sGeneralAttCheckCleanup;
+
+
+// ---------------------------------------------------------------------------
// Static member data initialization
// ---------------------------------------------------------------------------
ValueHashTableOf<unsigned short>* GeneralAttributeCheck::fAttMap = 0;
@@ -208,12 +219,6 @@
DatatypeValidator* GeneralAttributeCheck::fBooleanDV = 0;
DatatypeValidator* GeneralAttributeCheck::fAnyURIDV = 0;
-// ---------------------------------------------------------------------------
-// Static local data
-// ---------------------------------------------------------------------------
-static XMLMutex* sGeneralAttCheckMutex = 0;
-static XMLRegisterCleanup GeneralAttCheckCleanup;
-
// ---------------------------------------------------------------------------
// GeneralAttributeCheck: Constructors and Destructor
@@ -246,9 +251,9 @@
// TO DO - add remaining valdiators
}
-void GeneralAttributeCheck::mapElements() {
-
- if (!sGeneralAttCheckMutex)
+void GeneralAttributeCheck::mapElements()
+{
+ if (!sGeneralAttCheckMutexRegistered)
{
XMLMutex* tmpMutex = new XMLMutex;
if (XMLPlatformUtils::compareAndSwap((void**)&sGeneralAttCheckMutex,
tmpMutex, 0))
@@ -256,17 +261,20 @@
// Some other thread beat us to it, so let's clean up ours.
delete tmpMutex;
}
- else
+
+ // Now lock it and try to register it
+ XMLMutexLock lock(sGeneralAttCheckMutex);
+
+ // If we got here first, then register it and set the registered flag
+ if (!sGeneralAttCheckMutexRegistered)
{
- //
- // the thread who creates the mutex succesfully, to
- // initialize the followings
- //
+ // initialize
setUpValidators();
mapAttributes();
- // This is the real mutex. Register it for cleanup at Termination.
- GeneralAttCheckCleanup.registerCleanup(reinitGeneralAttCheck);
+ // register for cleanup at Termination.
+ sGeneralAttCheckCleanup.registerCleanup(reinitGeneralAttCheck);
+ sGeneralAttCheckMutexRegistered = true;
}
}
}
@@ -334,6 +342,7 @@
delete sGeneralAttCheckMutex;
sGeneralAttCheckMutex = 0;
+ sGeneralAttCheckMutexRegistered = false;
delete fAttMap;
delete fFacetsMap;
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]