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