You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by tn...@apache.org on 2003/01/09 16:30:09 UTC
cvs commit: xml-xerces/c/src/xercesc/validators/schema XSDErrorReporter.cpp XSDErrorReporter.hpp
tng 2003/01/09 07:30:09
Modified: c/src/xercesc/validators/schema XSDErrorReporter.cpp
XSDErrorReporter.hpp
Log:
Performance: construct message loader only when required.
Revision Changes Path
1.8 +47 -62 xml-xerces/c/src/xercesc/validators/schema/XSDErrorReporter.cpp
Index: XSDErrorReporter.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/XSDErrorReporter.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- XSDErrorReporter.cpp 4 Dec 2002 02:32:43 -0000 1.7
+++ XSDErrorReporter.cpp 9 Jan 2003 15:30:09 -0000 1.8
@@ -56,6 +56,9 @@
/**
* $Log$
+ * Revision 1.8 2003/01/09 15:30:09 tng
+ * Performance: construct message loader only when required.
+ *
* Revision 1.7 2002/12/04 02:32:43 knoaman
* #include cleanup.
*
@@ -87,7 +90,6 @@
// ---------------------------------------------------------------------------
// Includes
// ---------------------------------------------------------------------------
-#include <xercesc/util/Mutexes.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/framework/XMLErrorCodes.hpp>
@@ -103,62 +105,70 @@
// ---------------------------------------------------------------------------
// Local static data
// ---------------------------------------------------------------------------
-static bool sMsgMutexRegistered = false;
-static XMLMutex* sErrMsgMutex = 0;
-static XMLRegisterCleanup cleanupErrMsgMutex;
static XMLMsgLoader* gErrMsgLoader = 0;
static XMLMsgLoader* gValidMsgLoader = 0;
-static XMLRegisterCleanup cleanupErrMsgLoader;
// ---------------------------------------------------------------------------
// Local, static functions
// ---------------------------------------------------------------------------
-void XSDErrorReporter::reinitErrMsgLoader()
+static void reinitErrMsgLoader()
{
delete gErrMsgLoader;
gErrMsgLoader = 0;
- delete gValidMsgLoader;
- gValidMsgLoader = 0;
}
-
-void XSDErrorReporter::reinitErrMsgMutex()
+static void reinitValidMsgLoader()
{
- delete sErrMsgMutex;
- sErrMsgMutex = 0;
- sMsgMutexRegistered = false;
+ delete gValidMsgLoader;
+ gValidMsgLoader = 0;
}
-//
-// We need to fault in this mutex. But, since its used for synchronization
-// itself, we have to do this the low level way using a compare and swap.
-//
-static XMLMutex& gErrMsgMutex()
+static XMLMsgLoader* getErrMsgLoader()
{
- if (!sErrMsgMutex)
+ static XMLRegisterCleanup cleanupErrMsgLoader;
+ if (gErrMsgLoader == 0)
{
- XMLMutex* tmpMutex = new XMLMutex;
- if (XMLPlatformUtils::compareAndSwap((void**)&sErrMsgMutex, tmpMutex, 0))
- {
- // Someone beat us to it, so let's clean up ours
- delete tmpMutex;
+ XMLMsgLoader* t = XMLPlatformUtils::loadMsgSet(XMLUni::fgXMLErrDomain);
+ if (!t)
+ XMLPlatformUtils::panic(XMLPlatformUtils::Panic_CantLoadMsgDomain);
+ else {
+ if (XMLPlatformUtils::compareAndSwap((void **)&gErrMsgLoader, t, 0) != 0)
+ {
+ delete t;
+ }
+ else
+ {
+ cleanupErrMsgLoader.registerCleanup(reinitErrMsgLoader);
+ }
}
+ }
+ return gErrMsgLoader;
+}
- // Now lock it and try to register it
- XMLMutexLock lock(sErrMsgMutex);
- // If we got here first, then register it and set the registered flag
- if (!sMsgMutexRegistered)
- {
- cleanupErrMsgMutex.registerCleanup(XSDErrorReporter::reinitErrMsgMutex);
- sMsgMutexRegistered = true;
+static XMLMsgLoader* getValidMsgLoader()
+{
+ static XMLRegisterCleanup cleanupValidMsgLoader;
+ if (gValidMsgLoader == 0)
+ {
+ XMLMsgLoader* t = XMLPlatformUtils::loadMsgSet(XMLUni::fgXMLErrDomain);
+ if (!t)
+ XMLPlatformUtils::panic(XMLPlatformUtils::Panic_CantLoadMsgDomain);
+ else {
+ if (XMLPlatformUtils::compareAndSwap((void **)&gValidMsgLoader, t, 0) != 0)
+ {
+ delete t;
+ }
+ else
+ {
+ cleanupValidMsgLoader.registerCleanup(reinitValidMsgLoader);
+ }
}
}
- return *sErrMsgMutex;
+ return gValidMsgLoader;
}
-
// ---------------------------------------------------------------------------
// XSDErrorReporter: Constructors and Destructor
// ---------------------------------------------------------------------------
@@ -167,31 +177,6 @@
, fErrorReporter(errorReporter)
{
- //
- // We have to do a little init that involves statics, so we have to
- // use the mutex to protect it.
- //
- {
- XMLMutexLock lockInit(&gErrMsgMutex());
-
- // If we haven't loaded our message yet, then do that
- if (!gErrMsgLoader)
- {
- gErrMsgLoader = XMLPlatformUtils::loadMsgSet(XMLUni::fgXMLErrDomain);
- if (!gErrMsgLoader)
- XMLPlatformUtils::panic(XMLPlatformUtils::Panic_CantLoadMsgDomain);
-
- gValidMsgLoader = XMLPlatformUtils::loadMsgSet(XMLUni::fgValidityDomain);
- if (!gValidMsgLoader) {
-
- reinitErrMsgLoader();
- XMLPlatformUtils::panic(XMLPlatformUtils::Panic_CantLoadMsgDomain);
- }
-
- // Register this object to be cleaned up at termination
- cleanupErrMsgLoader.registerCleanup(reinitErrMsgLoader);
- }
- }
}
@@ -212,13 +197,13 @@
//
const unsigned int msgSize = 1023;
XMLCh errText[msgSize + 1];
- XMLMsgLoader* msgLoader = gErrMsgLoader;
+ XMLMsgLoader* msgLoader = getErrMsgLoader();
XMLErrorReporter::ErrTypes errType = XMLErrs::errorType((XMLErrs::Codes) toEmit);
if (XMLString::equals(msgDomain, XMLUni::fgValidityDomain)) {
errType = XMLValid::errorType((XMLValid::Codes) toEmit);
- msgLoader = gValidMsgLoader;
+ msgLoader = getValidMsgLoader();
}
if (!msgLoader->loadMsg(toEmit, errText, msgSize))
@@ -254,13 +239,13 @@
//
const unsigned int maxChars = 2047;
XMLCh errText[maxChars + 1];
- XMLMsgLoader* msgLoader = gErrMsgLoader;
+ XMLMsgLoader* msgLoader = getErrMsgLoader();
XMLErrorReporter::ErrTypes errType = XMLErrs::errorType((XMLErrs::Codes) toEmit);
if (XMLString::equals(msgDomain, XMLUni::fgValidityDomain)) {
errType = XMLValid::errorType((XMLValid::Codes) toEmit);
- msgLoader = gValidMsgLoader;
+ msgLoader = getValidMsgLoader();
}
if (!msgLoader->loadMsg(toEmit, errText, maxChars, text1, text2, text3, text4))
1.4 +1 -7 xml-xerces/c/src/xercesc/validators/schema/XSDErrorReporter.hpp
Index: XSDErrorReporter.hpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/XSDErrorReporter.hpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- XSDErrorReporter.hpp 4 Nov 2002 14:49:42 -0000 1.3
+++ XSDErrorReporter.hpp 9 Jan 2003 15:30:09 -0000 1.4
@@ -97,12 +97,6 @@
void setExitOnFirstFatal(const bool newValue);
// -----------------------------------------------------------------------
- // Notification that lazy data has been deleted
- // -----------------------------------------------------------------------
- static void reinitErrMsgMutex();
- static void reinitErrMsgLoader();
-
- // -----------------------------------------------------------------------
// Report error methods
// -----------------------------------------------------------------------
void emitError(const unsigned int toEmit,
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org