You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by jb...@apache.org on 2003/05/22 16:41:33 UTC
cvs commit: xml-xerces/c/src/xercesc/util XMemory.cpp
jberry 2003/05/22 07:41:33
Modified: c/src/xercesc/util XMemory.cpp
Log:
Ensure proper block alignment for blocks allocated with XMemory new operators
Revision Changes Path
1.2 +42 -15 xml-xerces/c/src/xercesc/util/XMemory.cpp
Index: XMemory.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XMemory.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- XMemory.cpp 30 Apr 2003 15:49:51 -0000 1.1
+++ XMemory.cpp 22 May 2003 14:41:33 -0000 1.2
@@ -69,33 +69,57 @@
XERCES_CPP_NAMESPACE_BEGIN
+
+// Calculate alignment required by platform.
+// Total size of our header must match platform
+// architecture-specific alignment, in order
+// that the returned block ptr (which follows our
+// header), maintains block/structure alignment.
+inline size_t
+CalculateBlockHeaderSize()
+{
+ // Macro XML_NEW_BLOCK_ALIGNMENT may be defined
+ // as needed to calculate alignment on a per-architecture
+ // basis.
+ #ifdef XML_NEW_BLOCK_ALIGNMENT
+ size_t alignment = XML_NEW_BLOCK_ALIGNMENT;
+ #else
+ size_t alignment = std::max(sizeof(void*), sizeof(double));
+ #endif
+
+ size_t headerUsage = sizeof(MemoryManager*);
+ return (headerUsage + (alignment - headerUsage % alignment));
+}
+
void* XMemory::operator new(size_t size)
{
+ size_t headerSize = CalculateBlockHeaderSize();
void* const block = XMLPlatformUtils::fgMemoryManager->allocate
(
- size + sizeof(MemoryManager*)
+ headerSize + size
);
-
*(MemoryManager**)block = XMLPlatformUtils::fgMemoryManager;
- return (char*)block + sizeof(MemoryManager*);
+ return (char*)block + headerSize;
}
void* XMemory::operator new(size_t size, MemoryManager* manager)
{
assert(manager != 0);
-
- void* const block = manager->allocate(size + sizeof(MemoryManager*));
+
+ size_t headerSize = CalculateBlockHeaderSize();
+ void* const block = manager->allocate(headerSize + size);
*(MemoryManager**)block = manager;
- return (char*)block + sizeof(MemoryManager*);
+ return (char*)block + headerSize;
}
void XMemory::operator delete(void* p)
{
if (p != 0)
{
- void* const block = (char*)p - sizeof(MemoryManager*);
+ size_t headerSize = CalculateBlockHeaderSize();
+ void* const block = (char*)p - headerSize;
MemoryManager* const manager = *(MemoryManager**)block;
assert(manager != 0);
@@ -105,13 +129,16 @@
void XMemory::operator delete(void* p, MemoryManager* manager)
{
- assert(p != 0 && manager != 0);
- assert
- (
- *(MemoryManager**)((char*)p - sizeof(MemoryManager*)) == manager
- );
-
- manager->deallocate((char*)p - sizeof(MemoryManager*));
+ assert(manager != 0);
+
+ if (p != 0)
+ {
+ size_t headerSize = CalculateBlockHeaderSize();
+ void* const block = (char*)p - headerSize;
+
+ assert(*(MemoryManager**)block == manager);
+ manager->deallocate(block);
+ }
}
XERCES_CPP_NAMESPACE_END
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org