peiyongz 2004/10/27 13:38:52 Modified: c/src/xercesc/internal XSerializeEngine.hpp XSerializeEngine.cpp Log: Optimized alignment for various data types Revision Changes Path 1.20 +12 -34 xml-xerces/c/src/xercesc/internal/XSerializeEngine.hpp Index: XSerializeEngine.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XSerializeEngine.hpp,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- XSerializeEngine.hpp 26 Oct 2004 14:49:27 -0000 1.19 +++ XSerializeEngine.hpp 27 Oct 2004 20:38:52 -0000 1.20 @@ -16,6 +16,9 @@ /* * $Log$ + * Revision 1.20 2004/10/27 20:38:52 peiyongz + * Optimized alignment for various data types + * * Revision 1.19 2004/10/26 14:49:27 peiyongz * Reset buffer/Provide position info for debugging * @@ -613,7 +616,9 @@ const unsigned long getBufCurAccumulated() const; inline - const unsigned long getBufCount() const; + const unsigned long getBufCount() const; + + void trace(char*) const; private: // ----------------------------------------------------------------------- @@ -676,9 +681,12 @@ inline void Assert(bool toEval , const XMLExcepts::Codes toThrow) const; - inline size_t allignAdjust() const; - inline void allignBufCur(); + inline size_t calBytesNeeded(size_t) const; + + inline size_t alignAdjust(size_t) const; + + inline void alignBufCur(size_t); // Make XTemplateSerializer friend of XSerializeEngine so that // we can call lookupStorePool and lookupLoadPool in the case of @@ -808,36 +816,6 @@ } -// For the following built-in datatype, we assume -// the same allignment requirement -// -// short unsigned short -// int unsigned long -// long unsigned long -// float -// double -// -// Based on the current position (fBufCur), calculated the needed size -// to read/write -// -inline size_t XSerializeEngine::allignAdjust() const -{ - #ifdef XML_PLATFORM_NEW_BLOCK_ALIGNMENT - size_t alignment = XML_PLATFORM_NEW_BLOCK_ALIGNMENT; - #else - size_t alignment = (sizeof(void*) >= sizeof(double)) ? sizeof(void*) : sizeof(double); - #endif - - size_t remainder = (size_t) fBufCur % alignment; - return (remainder == 0) ? 0 : (alignment - remainder); -} - -// Adjust the fBufCur -inline void XSerializeEngine::allignBufCur() -{ - fBufCur+=allignAdjust(); -} - inline void XSerializeEngine::readString(XMLCh*& toRead , int& bufferLen) { @@ -881,7 +859,7 @@ inline const unsigned long XSerializeEngine::getBufCurAccumulated() const { - return (fBufCount - isStoring() ? 0: 1)* fBufSize + (fBufCur-fBufStart); + return (fBufCount - (isStoring() ? 0: 1)) * fBufSize + (fBufCur-fBufStart); } inline 1.21 +76 -35 xml-xerces/c/src/xercesc/internal/XSerializeEngine.cpp Index: XSerializeEngine.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XSerializeEngine.cpp,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- XSerializeEngine.cpp 26 Oct 2004 14:49:27 -0000 1.20 +++ XSerializeEngine.cpp 27 Oct 2004 20:38:52 -0000 1.21 @@ -17,6 +17,9 @@ /* * $Id$ * $Log$ + * Revision 1.21 2004/10/27 20:38:52 peiyongz + * Optimized alignment for various data types + * * Revision 1.20 2004/10/26 14:49:27 peiyongz * Reset buffer/Provide position info for debugging * @@ -94,6 +97,9 @@ #include <xercesc/framework/BinOutputStream.hpp> #include <xercesc/util/BinInputStream.hpp> +#include <stdio.h> +#include <assert.h> + XERCES_CPP_NAMESPACE_BEGIN const bool XSerializeEngine::toWriteBufferLen = true; @@ -503,7 +509,6 @@ ) ensurePointer(lookupLoadPool(classIndex)); - } return true; @@ -658,8 +663,9 @@ XSerializeEngine& XSerializeEngine::operator<<(XMLCh xch) { - checkAndFlushBuffer(sizeof(XMLCh)); + checkAndFlushBuffer(calBytesNeeded(sizeof(XMLCh))); + alignBufCur(sizeof(XMLCh)); *(XMLCh*)fBufCur = xch; fBufCur += sizeof(XMLCh); return *this; @@ -667,8 +673,9 @@ XSerializeEngine& XSerializeEngine::operator>>(XMLCh& xch) { - checkAndFillBuffer(sizeof(XMLCh)); + checkAndFillBuffer(calBytesNeeded(sizeof(XMLCh))); + alignBufCur(sizeof(XMLCh)); xch = *(XMLCh*)fBufCur; fBufCur += sizeof(XMLCh); return *this; @@ -722,9 +729,9 @@ XSerializeEngine& XSerializeEngine::operator<<(short sh) { - checkAndFlushBuffer(allignAdjust()+sizeof(short)); + checkAndFlushBuffer(calBytesNeeded(sizeof(short))); - allignBufCur(); + alignBufCur(sizeof(short)); *(short*)fBufCur = sh; fBufCur += sizeof(short); return *this; @@ -732,9 +739,9 @@ XSerializeEngine& XSerializeEngine::operator>>(short& sh) { - checkAndFillBuffer(allignAdjust()+sizeof(short)); + checkAndFillBuffer(calBytesNeeded(sizeof(short))); - allignBufCur(); + alignBufCur(sizeof(short)); sh = *(short*)fBufCur; fBufCur += sizeof(short); return *this; @@ -742,9 +749,9 @@ XSerializeEngine& XSerializeEngine::operator<<(int i) { - checkAndFlushBuffer(allignAdjust()+sizeof(int)); + checkAndFlushBuffer(calBytesNeeded(sizeof(int))); - allignBufCur(); + alignBufCur(sizeof(int)); *(int*)fBufCur = i; fBufCur += sizeof(int); return *this; @@ -752,9 +759,9 @@ XSerializeEngine& XSerializeEngine::operator>>(int& i) { - checkAndFillBuffer(allignAdjust()+sizeof(int)); + checkAndFillBuffer(calBytesNeeded(sizeof(int))); - allignBufCur(); + alignBufCur(sizeof(int)); i = *(int*)fBufCur; fBufCur += sizeof(int); return *this; @@ -762,9 +769,10 @@ XSerializeEngine& XSerializeEngine::operator<<(unsigned int ui) { - checkAndFlushBuffer(allignAdjust()+sizeof(unsigned int)); - allignBufCur(); + checkAndFlushBuffer(calBytesNeeded(sizeof(unsigned int))); + + alignBufCur(sizeof(unsigned int)); *(unsigned int*)fBufCur = ui; fBufCur += sizeof(unsigned int); return *this; @@ -772,9 +780,10 @@ XSerializeEngine& XSerializeEngine::operator>>(unsigned int& ui) { - checkAndFillBuffer(allignAdjust()+sizeof(unsigned int)); - allignBufCur(); + checkAndFillBuffer(calBytesNeeded(sizeof(unsigned int))); + + alignBufCur(sizeof(unsigned int)); ui = *(unsigned int*)fBufCur; fBufCur += sizeof(unsigned int); return *this; @@ -782,9 +791,9 @@ XSerializeEngine& XSerializeEngine::operator<<(long l) { - checkAndFlushBuffer(allignAdjust()+sizeof(long)); + checkAndFlushBuffer(calBytesNeeded(sizeof(long))); - allignBufCur(); + alignBufCur(sizeof(long)); *(long*)fBufCur = l; fBufCur += sizeof(long); return *this; @@ -792,9 +801,9 @@ XSerializeEngine& XSerializeEngine::operator>>(long& l) { - checkAndFillBuffer(allignAdjust()+sizeof(long)); + checkAndFillBuffer(calBytesNeeded(sizeof(long))); - allignBufCur(); + alignBufCur(sizeof(long)); l = *(long*)fBufCur; fBufCur += sizeof(long); return *this; @@ -802,9 +811,9 @@ XSerializeEngine& XSerializeEngine::operator<<(unsigned long ul) { - checkAndFlushBuffer(allignAdjust()+sizeof(unsigned long)); + checkAndFlushBuffer(calBytesNeeded(sizeof(unsigned long))); - allignBufCur(); + alignBufCur(sizeof(unsigned long)); *(unsigned long*)fBufCur = ul; fBufCur += sizeof(unsigned long); return *this; @@ -812,9 +821,9 @@ XSerializeEngine& XSerializeEngine::operator>>(unsigned long& ul) { - checkAndFillBuffer(allignAdjust()+sizeof(unsigned long)); + checkAndFillBuffer(calBytesNeeded(sizeof(unsigned long))); - allignBufCur(); + alignBufCur(sizeof(unsigned long)); ul = *(unsigned long*)fBufCur; fBufCur += sizeof(unsigned long); return *this; @@ -822,9 +831,9 @@ XSerializeEngine& XSerializeEngine::operator<<(float f) { - checkAndFlushBuffer(allignAdjust()+sizeof(float)); + checkAndFlushBuffer(calBytesNeeded(sizeof(float))); - allignBufCur(); + alignBufCur(sizeof(float)); *(float*)fBufCur = *(float*)&f; fBufCur += sizeof(float); return *this; @@ -832,9 +841,9 @@ XSerializeEngine& XSerializeEngine::operator>>(float& f) { - checkAndFillBuffer(allignAdjust()+sizeof(float)); + checkAndFillBuffer(calBytesNeeded(sizeof(float))); - allignBufCur(); + alignBufCur(sizeof(float)); *(float*)&f = *(float*)fBufCur; fBufCur += sizeof(float); return *this; @@ -842,9 +851,9 @@ XSerializeEngine& XSerializeEngine::operator<<(double d) { - checkAndFlushBuffer(allignAdjust()+sizeof(double)); + checkAndFlushBuffer(calBytesNeeded(sizeof(double))); - allignBufCur(); + alignBufCur(sizeof(double)); *(double*)fBufCur = *(double*)&d; fBufCur += sizeof(double); return *this; @@ -852,9 +861,9 @@ XSerializeEngine& XSerializeEngine::operator>>(double& d) { - checkAndFillBuffer(allignAdjust()+sizeof(double)); + checkAndFillBuffer(calBytesNeeded(sizeof(double))); - allignBufCur(); + alignBufCur(sizeof(double)); *(double*)&d = *(double*)fBufCur; fBufCur += sizeof(double); return *this; @@ -884,7 +893,7 @@ /*** * an object tag read from the binary refering to * an object beyond the upper most boundary of the load pool - ***/ + ***/ TEST_THROW_ARG2( (objectTag > fLoadPool->size()) , objectTag , fLoadPool->size() @@ -921,7 +930,7 @@ , fObjectCount , fgMaxObjectCount , XMLExcepts::XSer_ObjCount_UppBnd_Exceed - ) + ) fObjectCount++; @@ -983,7 +992,7 @@ ensureStoring(); ensureStoreBuffer(); - fOutputStream->writeBytes(fBufStart, fBufSize); + fOutputStream->writeBytes(fBufStart, fBufSize); fBufCur = fBufStart; resetBuffer(); @@ -1000,7 +1009,7 @@ ) // fBufStart ... fBufCur ...fBufEnd - if ((fBufCur + bytesNeedToWrite) >= fBufEnd) + if ((fBufCur + bytesNeedToWrite) > fBufEnd) flushBuffer(); } @@ -1156,6 +1165,38 @@ { //todo: changed to return fGrammarPool->getMemoryManager() return fGrammarPool ? fGrammarPool->getMemoryManager() : XMLPlatformUtils::fgMemoryManager; +} + +// +// Based on the current position (fBufCur), calculated the needed size +// to read/write +// +inline size_t XSerializeEngine::alignAdjust(size_t size) const +{ + size_t remainder = (size_t) fBufCur % size; + return (remainder == 0) ? 0 : (size - remainder); +} + +// Adjust the fBufCur +inline void XSerializeEngine::alignBufCur(size_t size) +{ + fBufCur+=alignAdjust(size); + assert(((size_t) fBufCur % size)==0); +} + +inline size_t XSerializeEngine::calBytesNeeded(size_t size) const +{ + return (alignAdjust(size) + size); +} + +void XSerializeEngine::trace(char* funcName) const +{ + return; + + if (isStoring()) + printf("\n funcName=<%s>, storing, count=<%d>, postion=<%d>\n", funcName, fBufCount, getBufCurAccumulated()); + else + printf("\n funcName=<%s>, loading, count=<%d>, postion=<%d>\n", funcName, fBufCount, getBufCurAccumulated()); } XERCES_CPP_NAMESPACE_END
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]