knoaman     2004/01/08 20:39:56

  Modified:    c/src/xercesc/framework XMLValidator.cpp
               c/src/xercesc/internal XMLScanner.cpp
               c/src/xercesc/util XMLException.cpp PlatformUtils.hpp
                        PlatformUtils.cpp
  Log:
  Use a global static mutex for locking when creating local static mutexes instead of 
compareAndSwap.
  
  Revision  Changes    Path
  1.7       +23 -22    xml-xerces/c/src/xercesc/framework/XMLValidator.cpp
  
  Index: XMLValidator.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/framework/XMLValidator.cpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- XMLValidator.cpp  24 Dec 2003 15:24:13 -0000      1.6
  +++ XMLValidator.cpp  9 Jan 2004 04:39:56 -0000       1.7
  @@ -56,6 +56,9 @@
   
   /**
     * $Log$
  +  * Revision 1.7  2004/01/09 04:39:56  knoaman
  +  * Use a global static mutex for locking when creating local static mutexes 
instead of compareAndSwap.
  +  *
     * Revision 1.6  2003/12/24 15:24:13  cargilld
     * More updates to memory management so that the static memory manager.
     *
  @@ -158,14 +161,11 @@
   {
       if (!sMsgMutex)
       {
  -        XMLMutex* tmpMutex = new XMLMutex;
  -        if (XMLPlatformUtils::compareAndSwap((void**)&sMsgMutex, tmpMutex, 0))
  -        {
  -            // Someone beat us to it, so let's clean up ours
  -            delete tmpMutex;
  -        }
  -        else
  +        XMLMutexLock lockInit(XMLPlatformUtils::fgAtomicMutex);
  +
  +        if (!sMsgMutex)
           {
  +            sMsgMutex = new XMLMutex;
               validatorMutexCleanup.registerCleanup(XMLValidator::reinitMsgMutex);
           }
       }
  @@ -175,22 +175,23 @@
   
   static XMLMsgLoader& getMsgLoader()
   {
  -
  -     // Lock the mutex
  -     XMLMutexLock lockInit(&gValidatorMutex());
  -
       if (!sMsgLoader)
  -     {
  -             sMsgLoader = XMLPlatformUtils::loadMsgSet(XMLUni::fgValidityDomain);
  -             if (!sMsgLoader)
  -                     XMLPlatformUtils::panic(PanicHandler::Panic_CantLoadMsgDomain);
  -
  -        //
  -        // Register this XMLMsgLoader for cleanup at Termination.
  -        //
  -        msgLoaderCleanup.registerCleanup(XMLValidator::reinitMsgLoader);
  -     
  -     }
  +    {
  +         // Lock the mutex
  +         XMLMutexLock lockInit(&gValidatorMutex());
  +
  +        if (!sMsgLoader)
  +             {
  +                 sMsgLoader = 
XMLPlatformUtils::loadMsgSet(XMLUni::fgValidityDomain);
  +                 if (!sMsgLoader)
  +                         
XMLPlatformUtils::panic(PanicHandler::Panic_CantLoadMsgDomain);
  +
  +            //
  +            // Register this XMLMsgLoader for cleanup at Termination.
  +            //
  +            msgLoaderCleanup.registerCleanup(XMLValidator::reinitMsgLoader);
  +        }
  +    }
   
       return *sMsgLoader;
   }
  
  
  
  1.60      +15 -21    xml-xerces/c/src/xercesc/internal/XMLScanner.cpp
  
  Index: XMLScanner.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XMLScanner.cpp,v
  retrieving revision 1.59
  retrieving revision 1.60
  diff -u -r1.59 -r1.60
  --- XMLScanner.cpp    31 Dec 2003 15:40:00 -0000      1.59
  +++ XMLScanner.cpp    9 Jan 2004 04:39:56 -0000       1.60
  @@ -122,23 +122,14 @@
   //
   static XMLMutex& gScannerMutex()
   {
  -
  -    if (!sScannerMutex)
  +    if (!sRegistered)
       {
  -        XMLMutex* tmpMutex = new XMLMutex;
  -        if (XMLPlatformUtils::compareAndSwap((void**)&sScannerMutex, tmpMutex, 0))
  -        {
  -            // Someone beat us to it, so let's clean up ours
  -            delete tmpMutex;
  -        }
  -
  -        // Now lock it and try to register it
  -        XMLMutexLock lock(sScannerMutex);
  +        XMLMutexLock lockInit(XMLPlatformUtils::fgAtomicMutex);
   
  -        // If we got here first, then register it and set the registered flag
           if (!sRegistered)
           {
  -                     
scannerMutexCleanup.registerCleanup(XMLScanner::reinitScannerMutex);
  +            sScannerMutex = new XMLMutex;
  +            scannerMutexCleanup.registerCleanup(XMLScanner::reinitScannerMutex);
               sRegistered = true;
           }
       }
  @@ -147,17 +138,20 @@
   
   static XMLMsgLoader& gScannerMsgLoader()
   {
  -    XMLMutexLock lockInit(&gScannerMutex());
  -
  -    // If we haven't loaded our message yet, then do that
       if (!gMsgLoader)
       {
  -        gMsgLoader = XMLPlatformUtils::loadMsgSet(XMLUni::fgXMLErrDomain);
  +        XMLMutexLock lockInit(&gScannerMutex());
  +
  +        // If we haven't loaded our message yet, then do that
           if (!gMsgLoader)
  -            XMLPlatformUtils::panic(PanicHandler::Panic_CantLoadMsgDomain);
  +        {
  +            gMsgLoader = XMLPlatformUtils::loadMsgSet(XMLUni::fgXMLErrDomain);
  +            if (!gMsgLoader)
  +                XMLPlatformUtils::panic(PanicHandler::Panic_CantLoadMsgDomain);
   
  -        // Register this object to be cleaned up at termination
  -        cleanupMsgLoader.registerCleanup(XMLScanner::reinitMsgLoader);
  +            // Register this object to be cleaned up at termination
  +            cleanupMsgLoader.registerCleanup(XMLScanner::reinitMsgLoader);
  +        }
       }
   
       return *gMsgLoader;
  
  
  
  1.11      +28 -30    xml-xerces/c/src/xercesc/util/XMLException.cpp
  
  Index: XMLException.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XMLException.cpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- XMLException.cpp  29 Dec 2003 22:52:36 -0000      1.10
  +++ XMLException.cpp  9 Jan 2004 04:39:56 -0000       1.11
  @@ -95,7 +95,7 @@
   // ---------------------------------------------------------------------------
   static XMLMsgLoader* sMsgLoader = 0;
   static XMLRegisterCleanup msgLoaderCleanup;
  -
  +static bool sScannerMutexRegistered = false;
   static XMLMutex* sMsgMutex = 0;
   static XMLRegisterCleanup msgMutexCleanup;
   
  @@ -109,21 +109,16 @@
   //
   static XMLMutex& gMsgMutex()
   {
  -
  -    if (!sMsgMutex)
  +    if (!sScannerMutexRegistered)
       {
  -        XMLMutex* tmpMutex = new XMLMutex;
  -        if (XMLPlatformUtils::compareAndSwap((void**)&sMsgMutex, tmpMutex, 0))
  -        {
  -            // Some other thread beat us to it, so let's clean up ours.
  -            delete tmpMutex;
  -        }
  -        else
  +        XMLMutexLock lockInit(XMLPlatformUtils::fgAtomicMutex);
  +
  +        if (!sScannerMutexRegistered)
           {
  -            // This is the real mutex.  Register it for cleanup at Termination.
  -                     msgMutexCleanup.registerCleanup(XMLException::reinitMsgMutex);
  +            sMsgMutex = new XMLMutex;
  +            msgMutexCleanup.registerCleanup(XMLException::reinitMsgMutex);
  +            sScannerMutexRegistered = true;
           }
  -
       }
   
       return *sMsgMutex;
  @@ -135,21 +130,23 @@
   //
   static XMLMsgLoader& gGetMsgLoader()
   {
  -
  -    // Lock the message loader mutex and load the text
  -     XMLMutexLock lockInit(&gMsgMutex());
  -
  -    // Fault it in on first request
       if (!sMsgLoader)
       {
  -        sMsgLoader = XMLPlatformUtils::loadMsgSet(XMLUni::fgExceptDomain);
  -        if (!sMsgLoader)
  -            XMLPlatformUtils::panic(PanicHandler::Panic_CantLoadMsgDomain);
  +        // Lock the message loader mutex and load the text
  +         XMLMutexLock lockInit(&gMsgMutex());
   
  -        //
  -        // Register this XMLMsgLoader for cleanup at Termination.
  -        //
  -        msgLoaderCleanup.registerCleanup(XMLException::reinitMsgLoader);
  +        // Fault it in on first request
  +        if (!sMsgLoader)
  +        {
  +            sMsgLoader = XMLPlatformUtils::loadMsgSet(XMLUni::fgExceptDomain);
  +            if (!sMsgLoader)
  +                XMLPlatformUtils::panic(PanicHandler::Panic_CantLoadMsgDomain);
  +
  +            //
  +            // Register this XMLMsgLoader for cleanup at Termination.
  +            //
  +            msgLoaderCleanup.registerCleanup(XMLException::reinitMsgLoader);
  +        }
       }
   
       // We got it, so return it
  @@ -353,8 +350,9 @@
   // -----------------------------------------------------------------------
   void XMLException::reinitMsgMutex()
   {
  -     delete sMsgMutex;
  -     sMsgMutex = 0;
  +    delete sMsgMutex;
  +    sMsgMutex = 0;
  +    sScannerMutexRegistered = false;
   }
   
   // -----------------------------------------------------------------------
  @@ -362,8 +360,8 @@
   // -----------------------------------------------------------------------
   void XMLException::reinitMsgLoader()
   {
  -     delete sMsgLoader;
  -     sMsgLoader = 0;
  +    delete sMsgLoader;
  +    sMsgLoader = 0;
   }
   
   XERCES_CPP_NAMESPACE_END
  
  
  
  1.23      +4 -1      xml-xerces/c/src/xercesc/util/PlatformUtils.hpp
  
  Index: PlatformUtils.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/PlatformUtils.hpp,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- PlatformUtils.hpp 24 Dec 2003 15:24:13 -0000      1.22
  +++ PlatformUtils.hpp 9 Jan 2004 04:39:56 -0000       1.23
  @@ -71,6 +71,7 @@
   class XMLNetAccessor;
   class XMLTransService;
   class MemoryManager;
  +class XMLMutex;
   
   //
   //  For internal use only
  @@ -161,6 +162,8 @@
         *   there is no reason, nor facility, to override it.
         */
       static MemoryManager*       fgArrayMemoryManager;
  +
  +    static XMLMutex*            fgAtomicMutex;
       
       //@}
   
  
  
  
  1.17      +9 -0      xml-xerces/c/src/xercesc/util/PlatformUtils.cpp
  
  Index: PlatformUtils.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/PlatformUtils.cpp,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- PlatformUtils.cpp 17 Dec 2003 00:18:35 -0000      1.16
  +++ PlatformUtils.cpp 9 Jan 2004 04:39:56 -0000       1.17
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.17  2004/01/09 04:39:56  knoaman
  + * Use a global static mutex for locking when creating local static mutexes instead 
of compareAndSwap.
  + *
    * Revision 1.16  2003/12/17 00:18:35  cargilld
    * Update to memory management so that the static memory manager (one used to call 
Initialize) is only for static data.
    *
  @@ -230,6 +233,7 @@
   MemoryManagerArrayImpl  gArrayMemoryManager;
   MemoryManager*          XMLPlatformUtils::fgArrayMemoryManager = 
&gArrayMemoryManager;
   bool                    XMLPlatformUtils::fgMemMgrAdopted = true;
  +XMLMutex*               XMLPlatformUtils::fgAtomicMutex = 0;
   
   // ---------------------------------------------------------------------------
   //  XMLPlatformUtils: Init/term methods
  @@ -302,6 +306,7 @@
   
        // Create the mutex for the static data cleanup list
       gXMLCleanupListMutex = new XMLMutex;
  +    fgAtomicMutex = new XMLMutex;
   
       //
       //  Ask the per-platform code to make the desired transcoding service for
  @@ -385,6 +390,10 @@
       // Clean up the sync mutex
       delete gSyncMutex;
       gSyncMutex = 0;
  +
  +    // Clean up mutex
  +    delete fgAtomicMutex;
  +    fgAtomicMutex = 0;
   
        // Clean up statically allocated, lazily cleaned data in each class
        // that has registered for it.
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to