mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-30 00:32:57 -04:00
fix MemoryHook internal memory alignment issues
This commit is contained in:
parent
c5c21a566a
commit
66a52cb6a3
@ -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];
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
@ -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();
|
||||
|
||||
|
@ -218,7 +218,7 @@ private:
|
||||
};
|
||||
typedef pmap<GeomCollectorKey, GeomCollector> 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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user