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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]