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]

Reply via email to