diff --git a/dtool/src/dtoolbase/memoryHook.I b/dtool/src/dtoolbase/memoryHook.I index 989652d884..b3a9501ad5 100644 --- a/dtool/src/dtoolbase/memoryHook.I +++ b/dtool/src/dtoolbase/memoryHook.I @@ -136,11 +136,11 @@ alloc_to_ptr(void *alloc, size_t size) { #if defined(MEMORY_HOOK_DO_ALIGN) size_t alignment = get_memory_alignment(); // Move the allocated pointer up to the next even alignment. - void *new_ptr = (void *)((((size_t)alloc + alignment - 1) / alignment) * alignment); - size_t *root = (size_t *)new_ptr; + size_t *root = (size_t *)((((size_t)alloc + alignment - 1) / alignment) * alignment); + assert(alloc <= root && (char *)root - (char *)alloc < alignment); root[0] = size; root[1] = (size_t)alloc; // Save the pointer we originally allocated. - return (void *)((char *)new_ptr + _header_reserved_bytes); + return (void *)((char *)root + _header_reserved_bytes); #elif defined(DO_MEMORY_USAGE) size_t *root = (size_t *)alloc; root[0] = size; @@ -162,7 +162,9 @@ ptr_to_alloc(void *ptr, size_t &size) { #if defined(MEMORY_HOOK_DO_ALIGN) size_t *root = (size_t *)((char *)ptr - _header_reserved_bytes); size = root[0]; - return (void *)root[1]; // Return the pointer we originally allocated. + void *alloc = (void *)root[1]; // Get the pointer we originally allocated. + assert(alloc <= root && (char *)root - (char *)alloc < get_memory_alignment()); + return alloc; #elif defined(DO_MEMORY_USAGE) size_t *root = (size_t *)((char *)ptr - _header_reserved_bytes); size = root[0]; diff --git a/dtool/src/dtoolbase/memoryHook.cxx b/dtool/src/dtoolbase/memoryHook.cxx index aefc849ddc..618a0e0d33 100644 --- a/dtool/src/dtoolbase/memoryHook.cxx +++ b/dtool/src/dtoolbase/memoryHook.cxx @@ -224,7 +224,9 @@ heap_alloc_single(size_t size) { } #endif // DO_MEMORY_USAGE - return alloc_to_ptr(alloc, size); + void *ptr = alloc_to_ptr(alloc, size); + assert(ptr >= alloc && (char *)ptr + size <= (char *)alloc + inflated_size); + return ptr; } //////////////////////////////////////////////////////////////////// @@ -298,7 +300,9 @@ heap_alloc_array(size_t size) { } #endif // DO_MEMORY_USAGE - return alloc_to_ptr(alloc, size); + void *ptr = alloc_to_ptr(alloc, size); + assert(ptr >= alloc && (char *)ptr + size <= (char *)alloc + inflated_size); + return ptr; } //////////////////////////////////////////////////////////////////// @@ -319,30 +323,42 @@ heap_realloc_array(void *ptr, size_t size) { size_t inflated_size = inflate_size(size); + void *alloc1 = alloc; #ifdef MEMORY_HOOK_MALLOC_LOCK _lock.acquire(); - alloc = call_realloc(alloc, inflated_size); + alloc1 = call_realloc(alloc1, inflated_size); _lock.release(); #else - alloc = call_realloc(alloc, inflated_size); + alloc1 = call_realloc(alloc1, inflated_size); #endif - while (alloc == (void *)NULL) { + while (alloc1 == (void *)NULL) { alloc_fail(inflated_size); // Recover the original pointer. - alloc = ptr_to_alloc(ptr, orig_size); + alloc1 = alloc; #ifdef MEMORY_HOOK_MALLOC_LOCK _lock.acquire(); - alloc = call_realloc(alloc, inflated_size); + alloc1 = call_realloc(alloc1, inflated_size); _lock.release(); #else - alloc = call_realloc(alloc, inflated_size); + alloc1 = call_realloc(alloc1, inflated_size); #endif } - return alloc_to_ptr(alloc, size); + void *ptr1 = alloc_to_ptr(alloc1, size); + assert(ptr1 >= alloc1 && (char *)ptr1 + size <= (char *)alloc1 + inflated_size); +#if defined(MEMORY_HOOK_DO_ALIGN) + // We might have to shift the memory to account for the new offset + // due to the alignment. + size_t orig_delta = (char *)ptr - (char *)alloc; + size_t new_delta = (char *)ptr1 - (char *)alloc1; + if (orig_delta != new_delta) { + memmove((char *)alloc1 + new_delta, (char *)alloc1 + orig_delta, min(size, orig_size)); + } +#endif // MEMORY_HOOK_DO_ALIGN + return ptr1; } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/gobj/geomVertexColumn.h b/panda/src/gobj/geomVertexColumn.h index df986ee99d..1794ab3d9a 100644 --- a/panda/src/gobj/geomVertexColumn.h +++ b/panda/src/gobj/geomVertexColumn.h @@ -102,7 +102,7 @@ private: // for implementing the common, very direct code paths (for // instance, 3-component float32 to LVecBase3f) as quickly as // possible. - class Packer { + class Packer : public MemoryBase { public: virtual ~Packer(); diff --git a/panda/src/text/textAssembler.h b/panda/src/text/textAssembler.h index 772fcf0f9f..07bb80b0b9 100644 --- a/panda/src/text/textAssembler.h +++ b/panda/src/text/textAssembler.h @@ -218,7 +218,7 @@ private: }; typedef pmap GeomCollectorMap; - class GlyphPlacement { + class GlyphPlacement : public MemoryBase { public: INLINE void add_piece(Geom *geom, const RenderState *state); void calc_tight_bounds(LPoint3 &min_point, LPoint3 &max_point,