You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by am...@apache.org on 2006/07/25 10:44:03 UTC

svn commit: r425332 - in /xerces/c/trunk/src/xercesc: dom/impl/DOMCharacterDataImpl.cpp dom/impl/DOMDocumentImpl.cpp dom/impl/DOMDocumentImpl.hpp dom/impl/DOMStringPool.hpp util/RefStackOf.c util/RefStackOf.hpp

Author: amassari
Date: Tue Jul 25 01:44:03 2006
New Revision: 425332

URL: http://svn.apache.org/viewvc?rev=425332&view=rev
Log:
Reduce the number of allocations needed by text and attribute nodes (jira#1585)

Modified:
    xerces/c/trunk/src/xercesc/dom/impl/DOMCharacterDataImpl.cpp
    xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.cpp
    xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.hpp
    xerces/c/trunk/src/xercesc/dom/impl/DOMStringPool.hpp
    xerces/c/trunk/src/xercesc/util/RefStackOf.c
    xerces/c/trunk/src/xercesc/util/RefStackOf.hpp

Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMCharacterDataImpl.cpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMCharacterDataImpl.cpp?rev=425332&r1=425331&r2=425332&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/dom/impl/DOMCharacterDataImpl.cpp (original)
+++ xerces/c/trunk/src/xercesc/dom/impl/DOMCharacterDataImpl.cpp Tue Jul 25 01:44:03 2006
@@ -35,7 +35,7 @@
 {
     fDoc = (DOMDocumentImpl*)doc;
 
-    fDataBuf = fDoc->popBuffer();
+    fDataBuf = fDoc->popBuffer(XMLString::stringLen(dat)+1);
     if (!fDataBuf)
         fDataBuf = new (fDoc) DOMBuffer(fDoc, dat);
     else
@@ -50,7 +50,7 @@
 {
     fDoc = (DOMDocumentImpl*)other.fDoc;
 
-    fDataBuf = fDoc->popBuffer();
+    fDataBuf = fDoc->popBuffer(other.getLength()+1);
     if (!fDataBuf)
         fDataBuf = new (fDoc) DOMBuffer(fDoc, other.fDataBuf->getRawBuffer());
     else

Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.cpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.cpp?rev=425332&r1=425331&r2=425332&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.cpp (original)
+++ xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.cpp Tue Jul 25 01:44:03 2006
@@ -1414,11 +1414,15 @@
     fRecycleBufferPtr->push(buffer);
 }
 
-DOMBuffer* DOMDocumentImpl::popBuffer()
+DOMBuffer* DOMDocumentImpl::popBuffer(XMLSize_t nMinSize)
 {
     if (!fRecycleBufferPtr || fRecycleBufferPtr->empty())
         return 0;
 
+    for(unsigned int index=fRecycleBufferPtr->size()-1;index>0;index--)
+        if(fRecycleBufferPtr->elementAt(index)->getCapacity()>=nMinSize)
+            return fRecycleBufferPtr->popAt(index);
+    // if we didn't find a buffer big enough, get the last one
     return fRecycleBufferPtr->pop();
 }
 

Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.hpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.hpp?rev=425332&r1=425331&r2=425332&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.hpp (original)
+++ xerces/c/trunk/src/xercesc/dom/impl/DOMDocumentImpl.hpp Tue Jul 25 01:44:03 2006
@@ -255,7 +255,7 @@
     void                         deleteHeap();
     void                         releaseDocNotifyUserData(DOMNode* object);
     void                         releaseBuffer(DOMBuffer* buffer);
-    DOMBuffer*                   popBuffer();
+    DOMBuffer*                   popBuffer(XMLSize_t nMinSize);
     MemoryManager*               getMemoryManager() const;
 
     // Factory methods for getting/creating node lists.

Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMStringPool.hpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMStringPool.hpp?rev=425332&r1=425331&r2=425332&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/dom/impl/DOMStringPool.hpp (original)
+++ xerces/c/trunk/src/xercesc/dom/impl/DOMStringPool.hpp Tue Jul 25 01:44:03 2006
@@ -130,6 +130,11 @@
         return fIndex;
     }
 
+    unsigned int getCapacity() const
+    {
+        return fCapacity;
+    }
+
     // -----------------------------------------------------------------------
     //  Private helpers
     // -----------------------------------------------------------------------

Modified: xerces/c/trunk/src/xercesc/util/RefStackOf.c
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/util/RefStackOf.c?rev=425332&r1=425331&r2=425332&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/util/RefStackOf.c (original)
+++ xerces/c/trunk/src/xercesc/util/RefStackOf.c Tue Jul 25 01:44:03 2006
@@ -51,9 +51,18 @@
 template <class TElem> const TElem* RefStackOf<TElem>::
 elementAt(const unsigned int index) const
 {
-    if (index > fVector.size())
+    if (index >= fVector.size())
         ThrowXMLwithMemMgr(ArrayIndexOutOfBoundsException, XMLExcepts::Stack_BadIndex, fVector.getMemoryManager());
     return fVector.elementAt(index);
+}
+
+template <class TElem> TElem* RefStackOf<TElem>::popAt(const unsigned int index)
+{
+    if (index >= fVector.size())
+        ThrowXMLwithMemMgr(ArrayIndexOutOfBoundsException, XMLExcepts::Stack_BadIndex, fVector.getMemoryManager());
+
+    // Orphan off the element from the slot in the vector
+    return fVector.orphanElementAt(index);
 }
 
 template <class TElem> void RefStackOf<TElem>::push(TElem* const toPush)

Modified: xerces/c/trunk/src/xercesc/util/RefStackOf.hpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/util/RefStackOf.hpp?rev=425332&r1=425331&r2=425332&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/util/RefStackOf.hpp (original)
+++ xerces/c/trunk/src/xercesc/util/RefStackOf.hpp Tue Jul 25 01:44:03 2006
@@ -49,6 +49,7 @@
     //  Element management methods
     // -----------------------------------------------------------------------
     const TElem* elementAt(const unsigned int index) const;
+    TElem* popAt(const unsigned int index);
     void push(TElem* const toPush);
     const TElem* peek() const;
     TElem* pop();



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