You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by ca...@apache.org on 2004/12/13 17:36:43 UTC

cvs commit: xml-xerces/c/src/xercesc/framework XMLBuffer.cpp XMLBuffer.hpp

cargilld    2004/12/13 08:36:43

  Modified:    c/src/xercesc/framework XMLBuffer.cpp XMLBuffer.hpp
  Log:
  Performance improvement from Christian Will and bug fix from David Bertoni.
  
  Revision  Changes    Path
  1.8       +19 -24    xml-xerces/c/src/xercesc/framework/XMLBuffer.cpp
  
  Index: XMLBuffer.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/framework/XMLBuffer.cpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- XMLBuffer.cpp	29 Sep 2004 20:33:51 -0000	1.7
  +++ XMLBuffer.cpp	13 Dec 2004 16:36:43 -0000	1.8
  @@ -16,6 +16,9 @@
   
   /**
    * $Log$
  + * Revision 1.8  2004/12/13 16:36:43  cargilld
  + * Performance improvement from Christian Will and bug fix from David Bertoni.
  + *
    * Revision 1.7  2004/09/29 20:33:51  peiyongz
    * resize the internal buffer even the handler can successfully flush the buffer
    *
  @@ -69,22 +72,9 @@
   // ---------------------------------------------------------------------------
   //  XMLBuffer: Buffer management
   // ---------------------------------------------------------------------------
  -void XMLBuffer::append(const XMLCh* const chars, const unsigned int count)
  -{
  -    unsigned int actualCount = count;
  -    if (!count)
  -        actualCount = XMLString::stringLen(chars);
  -    insureCapacity(actualCount);
  -    memcpy(&fBuffer[fIndex], chars, actualCount * sizeof(XMLCh));
  -    fIndex += actualCount;
  -}
   
   void XMLBuffer::insureCapacity(const unsigned int extraNeeded)
  -{
  -    // If we can handle it, do nothing yet
  -    if (fIndex + extraNeeded < fCapacity)
  -        return;
  -
  +{    
       // If we can't handle it, try doubling the buffer size.
       unsigned int newCap = (fIndex + extraNeeded) * 2;
   
  @@ -115,16 +105,21 @@
               ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::Array_BadNewSize, fMemoryManager);
       }
   
  -    // Allocate new buffer
  -    XMLCh* newBuf = (XMLCh*) fMemoryManager->allocate((newCap+1) * sizeof(XMLCh)); //new XMLCh[newCap+1];
  -
  -    // Copy over the old stuff
  -    memcpy(newBuf, fBuffer, fCapacity * sizeof(XMLCh));
  -
  -    // Clean up old buffer and store new stuff
  -    fMemoryManager->deallocate(fBuffer); //delete [] fBuffer;
  -    fBuffer = newBuf;
  -    fCapacity = newCap;
  +    // Note the previous if block can modify newCap, so we may not need to allocate
  +    // at all.
  +    if (newCap > fCapacity)
  +    {
  +        // Allocate new buffer
  +        XMLCh* newBuf = (XMLCh*) fMemoryManager->allocate((newCap+1) * sizeof(XMLCh)); //new XMLCh[newCap+1];
  + 
  +        // Copy over the old stuff
  +        memcpy(newBuf, fBuffer, fIndex * sizeof(XMLCh));
  +
  +        // Clean up old buffer and store new stuff
  +        fMemoryManager->deallocate(fBuffer); //delete [] fBuffer;
  +        fBuffer = newBuf;
  +        fCapacity = newCap;
  +    }
   }
   
   XERCES_CPP_NAMESPACE_END
  
  
  
  1.9       +75 -18    xml-xerces/c/src/xercesc/framework/XMLBuffer.hpp
  
  Index: XMLBuffer.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/framework/XMLBuffer.hpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- XMLBuffer.hpp	29 Sep 2004 18:59:18 -0000	1.8
  +++ XMLBuffer.hpp	13 Dec 2004 16:36:43 -0000	1.9
  @@ -16,6 +16,9 @@
   
   /*
    * $Log$
  + * Revision 1.9  2004/12/13 16:36:43  cargilld
  + * Performance improvement from Christian Will and bug fix from David Bertoni.
  + *
    * Revision 1.8  2004/09/29 18:59:18  peiyongz
    * [jira1207] --patch from Dan Rosen
    *
  @@ -72,6 +75,7 @@
   #include <xercesc/util/XMemory.hpp>
   #include <xercesc/util/PlatformUtils.hpp>
   #include <xercesc/framework/MemoryManager.hpp>
  +#include <string.h>
   
   XERCES_CPP_NAMESPACE_BEGIN
   
  @@ -84,10 +88,10 @@
    *  that appends of characters and other buffers or strings be very fast, so
    *  it always maintains the current buffer size.
    *
  - *  The buffer is not nul terminated until some asks to see the raw buffer
  + *  The buffer is not null terminated until some asks to see the raw buffer
    *  contents. This also avoids overhead during append operations.
    */
  - class XMLPARSER_EXPORT XMLBuffer : public XMemory
  +class XMLPARSER_EXPORT XMLBuffer : public XMemory
   {
   public :
       // -----------------------------------------------------------------------
  @@ -98,13 +102,13 @@
       //@{
       XMLBuffer(const unsigned int capacity = 1023
                 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager) :
  -
  -        fUsed(false)
  -        , fIndex(0)
  +        
  +        fIndex(0)
           , fCapacity(capacity)
  -        , fMemoryManager(manager)
  -        , fFullHandler(0)
           , fFullSize(0)
  +        , fUsed(false)
  +        , fMemoryManager(manager)
  +        , fFullHandler(0)       
           , fBuffer(0)
       {
           // Buffer is one larger than capacity, to allow for zero term
  @@ -128,8 +132,28 @@
       // -----------------------------------------------------------------------
       void setFullHandler(XMLBufferFullHandler* handler, const unsigned int fullSize)
       {
  -        fFullHandler = handler;
  -        fFullSize = fullSize;
  +        if (handler && fullSize) {            
  +            fFullHandler = handler;
  +            fFullSize = fullSize;
  +
  +            // Need to consider the case that the fullsize is less than the current capacity.
  +            // For example, say fullSize = 100 and fCapacity is 1023 (the default).
  +            // If the fIndex is less than the fullSize, then no problem.  We can just carry
  +            // on by resetting fCapacity to fullsize and proceed business as usual.            
  +            // If the fIndex is already bigger than the fullSize then we call insureCapacity
  +            // to see if it can handle emptying the current buffer (it will throw an
  +            // exception if it can't).
  +            if (fullSize < fCapacity) {
  +                fCapacity = fullSize;
  +                if (fIndex >= fullSize) {
  +                    insureCapacity(0); 
  +                }               
  +            }
  +        }
  +        else {
  +            // reset fFullHandler to zero because setFullHandler had bad input
  +            fFullHandler = 0;            
  +        }
       }
   
       // -----------------------------------------------------------------------
  @@ -143,14 +167,47 @@
           fBuffer[fIndex++] = toAppend;
       }
   
  -    void append (const XMLCh* const chars, const unsigned int count = 0);
  +    void append (const XMLCh* const chars, const unsigned int count)
  +    {        
  +        if (count) {
  +            if (fIndex + count >= fCapacity) {
  +                insureCapacity(count);
  +            }            
  +            memcpy(&fBuffer[fIndex], chars, count * sizeof(XMLCh));
  +            fIndex += count;
  +        }
  +        else {
  +            append(chars);
  +        }
  +    }
  +
  +    void append (const XMLCh* const chars)
  +    {
  +        if (chars != 0 && *chars != 0) {
  +            // get length of chars
  +            unsigned int count = 0;
  +            for (; *(chars+count); count++ );
  +
  +            if (fIndex + count >= fCapacity) {
  +                insureCapacity(count);
  +            }  
  +            memcpy(&fBuffer[fIndex], chars, count * sizeof(XMLCh));
  +            fIndex += count;
  +        }
  +    }
   
  -    void set (const XMLCh* const chars, const unsigned int count = 0)
  +    void set (const XMLCh* const chars, const unsigned int count)
       {
           fIndex = 0;
           append(chars, count);
       }
   
  +    void set (const XMLCh* const chars)
  +    {
  +        fIndex = 0;
  +        append(chars);
  +    }
  +
       const XMLCh* getRawBuffer() const
       {
           fBuffer[fIndex] = 0;
  @@ -236,14 +293,14 @@
       //      indicated by fFullSize. If writing to the buffer would exceed the
       //      buffer's maximum size, fFullHandler's bufferFull callback is
       //      invoked, to empty the buffer.
  -    // -----------------------------------------------------------------------
  -    bool            fUsed;
  -    unsigned int    fIndex;
  -    unsigned int    fCapacity;
  -    MemoryManager* const        fMemoryManager;
  -    XMLBufferFullHandler*       fFullHandler;
  +    // -----------------------------------------------------------------------    
  +    unsigned int                fIndex;
  +    unsigned int                fCapacity;
       unsigned int                fFullSize;
  -    XMLCh*          fBuffer;
  +    bool                        fUsed;
  +    MemoryManager* const        fMemoryManager;
  +    XMLBufferFullHandler*       fFullHandler;    
  +    XMLCh*                      fBuffer;
   };
   
   /**
  
  
  

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