You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by kn...@apache.org on 2004/01/12 22:30:56 UTC

cvs commit: xml-xerces/c/src/xercesc/dom/impl DOMNodeImpl.cpp

knoaman     2004/01/12 13:30:56

  Modified:    c/src/xercesc/dom/impl DOMNodeImpl.cpp
  Log:
  Use a global static mutex for locking when creating local static mutexes instead of compareAndSwap
  
  Revision  Changes    Path
  1.27      +24 -9     xml-xerces/c/src/xercesc/dom/impl/DOMNodeImpl.cpp
  
  Index: DOMNodeImpl.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/dom/impl/DOMNodeImpl.cpp,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- DOMNodeImpl.cpp	23 Oct 2003 21:19:58 -0000	1.26
  +++ DOMNodeImpl.cpp	12 Jan 2004 21:30:56 -0000	1.27
  @@ -98,11 +98,16 @@
   // -----------------------------------------------------------------------
   //  Reset the singleton gEmptyNodeList
   // -----------------------------------------------------------------------
  -static DOMNodeListImpl *gEmptyNodeList;  // make a singleton empty node list
  +static DOMNodeListImpl *gEmptyNodeList = 0;  // make a singleton empty node list
  +static XMLMutex* gEmptyNodeListMutex = 0;
  +
   static void reinitEmptyNodeList()
   {
       delete gEmptyNodeList;
       gEmptyNodeList = 0;
  +
  +    delete gEmptyNodeListMutex;
  +    gEmptyNodeListMutex = 0;
   }
   
   // -----------------------------------------------------------------------
  @@ -149,21 +154,31 @@
   
   
   DOMNodeList *DOMNodeImpl::getChildNodes() const {
  +
       static XMLRegisterCleanup emptyNodeListCleanup;
   
  -    if (gEmptyNodeList == 0)
  +    if (!gEmptyNodeList)
       {
  -        DOMNodeList *t = new DOMNodeListImpl(0);
  -        if (XMLPlatformUtils::compareAndSwap((void **)&gEmptyNodeList, t, 0) != 0)
  +        if (!gEmptyNodeListMutex)
           {
  -            delete t;
  +            XMLMutexLock lock(XMLPlatformUtils::fgAtomicMutex);
  +			
  +            if (!gEmptyNodeListMutex)
  +                gEmptyNodeListMutex = new XMLMutex;
           }
  -        else
  +
  +        // Use a faux scope to synchronize while we do this
           {
  -            emptyNodeListCleanup.registerCleanup(reinitEmptyNodeList);
  -        }
  +            XMLMutexLock lock(gEmptyNodeListMutex);
   
  +            if (!gEmptyNodeList)
  +            {
  +                gEmptyNodeList = new DOMNodeListImpl(0);
  +                emptyNodeListCleanup.registerCleanup(reinitEmptyNodeList);
  +            }
  +        }
       }
  +
       return (DOMNodeList *)gEmptyNodeList;
   };
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org