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]