82 lines
2.5 KiB
Text
82 lines
2.5 KiB
Text
|
/**
|
||
|
* PANDA 3D SOFTWARE
|
||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||
|
*
|
||
|
* All use of this software is subject to the terms of the revised BSD
|
||
|
* license. You should have received a copy of this license along
|
||
|
* with this source code in a file named "LICENSE."
|
||
|
*
|
||
|
* @file memoryHook.I
|
||
|
* @author drose
|
||
|
* @date 2007-06-28
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Called by our alternative malloc implementations (dlmalloc and ptmalloc2)
|
||
|
* to indicate they have requested size bytes from the system for the heap.
|
||
|
*/
|
||
|
INLINE void MemoryHook::
|
||
|
inc_heap(size_t size) {
|
||
|
#ifdef DO_MEMORY_USAGE
|
||
|
AtomicAdjust::add(_requested_heap_size, (AtomicAdjust::Integer)size);
|
||
|
#endif // DO_MEMORY_USAGE
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Called by our alternative malloc implementations (dlmalloc and ptmalloc2)
|
||
|
* to indicate they have returned size bytes to the system from the heap.
|
||
|
*/
|
||
|
INLINE void MemoryHook::
|
||
|
dec_heap(size_t size) {
|
||
|
#ifdef DO_MEMORY_USAGE
|
||
|
// assert((int)size <= _requested_heap_size);
|
||
|
AtomicAdjust::add(_requested_heap_size, -(AtomicAdjust::Integer)size);
|
||
|
#endif // DO_MEMORY_USAGE
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the operating system page size. This is the minimum granularity
|
||
|
* required for calls to mmap_alloc(). Also see round_up_to_page_size().
|
||
|
*/
|
||
|
INLINE size_t MemoryHook::
|
||
|
get_page_size() const {
|
||
|
return _page_size;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Rounds the indicated size request up to the next larger multiple of
|
||
|
* page_size, to qualify it for a call to mmap_alloc().
|
||
|
*/
|
||
|
INLINE size_t MemoryHook::
|
||
|
round_up_to_page_size(size_t size) const {
|
||
|
return ((size + _page_size - 1) / _page_size) * _page_size;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Given a pointer that was returned by a MemoryHook allocation, returns the
|
||
|
* number of bytes that were allocated for it. This may be slightly larger
|
||
|
* than the number of bytes requested.
|
||
|
* The behavior of this function is undefined if the given pointer was not
|
||
|
* returned by the MemoryHook allocator or was already freed.
|
||
|
* May return 0 if not compiling with DO_MEMORY_USAGE.
|
||
|
*
|
||
|
* This is only defined publicly so TypeHandle can get at it; it really
|
||
|
* shouldn't be used outside of dtoolbase.
|
||
|
*/
|
||
|
INLINE size_t MemoryHook::
|
||
|
get_ptr_size(void *ptr) {
|
||
|
#if defined(MEMORY_HOOK_DO_ALIGN)
|
||
|
uintptr_t *root = (uintptr_t *)ptr;
|
||
|
return (size_t)root[-2];
|
||
|
#elif defined(USE_MEMORY_DLMALLOC) || defined(USE_MEMORY_PTMALLOC2)
|
||
|
// If we are using dlmalloc, we know how it stores the size.
|
||
|
size_t *root = (size_t *)ptr;
|
||
|
return (root[-1] & ~0x7) - sizeof(size_t);
|
||
|
#elif defined(DO_MEMORY_USAGE)
|
||
|
size_t *root = (size_t *)((char *)ptr - MEMORY_HOOK_ALIGNMENT);
|
||
|
return *root;
|
||
|
#else
|
||
|
return 0;
|
||
|
#endif // DO_MEMORY_USAGE
|
||
|
}
|