diff --git a/dtool/src/dtoolbase/deletedBufferChain.I b/dtool/src/dtoolbase/deletedBufferChain.I index 683b5b285e..d9514929c5 100644 --- a/dtool/src/dtoolbase/deletedBufferChain.I +++ b/dtool/src/dtoolbase/deletedBufferChain.I @@ -59,7 +59,7 @@ node_to_buffer(DeletedBufferChain::ObjectNode *node) { #if defined(USE_DELETEDCHAINFLAG) && defined(USE_DELETED_CHAIN) // In development mode, we increment the pointer so that the // returned data does not overlap our _flag member. - return (void *)(((char *)node) + get_flag_reserved_bytes()); + return (void *)(((char *)node) + flag_reserved_bytes); #else return (void *)node; #endif // NDEBUG @@ -75,33 +75,8 @@ buffer_to_node(void *ptr) { #if defined(USE_DELETEDCHAINFLAG) && defined(USE_DELETED_CHAIN) // In development mode, we decrement the pointer to undo the // increment we did above. - return (ObjectNode *)(((char *)ptr) - get_flag_reserved_bytes()); + return (ObjectNode *)(((char *)ptr) - flag_reserved_bytes); #else return (ObjectNode *)ptr; #endif // NDEBUG } - -//////////////////////////////////////////////////////////////////// -// Function: DeletedBufferChain::get_flag_reserved_bytes -// Access: Private, Static -// Description: Returns the number of extra bytes reserved at the -// beginning of each buffer for the _flag member. -//////////////////////////////////////////////////////////////////// -INLINE size_t DeletedBufferChain:: -get_flag_reserved_bytes() { -#ifndef USE_DELETEDCHAINFLAG - // Without DELETEDCHAINFLAG, we don't even store the _flag member at - // all, and this method is never called. - static const size_t flag_reserved_bytes = 0; - -#elif defined(LINMATH_ALIGN) - // With SSE2 alignment, we need all 16 bytes to preserve alignment. - static const size_t flag_reserved_bytes = 16; - -#else - // Otherwise, we only need enough space for the Integer itself. - static const size_t flag_reserved_bytes = sizeof(AtomicAdjust::Integer); -#endif // USE_DELETEDCHAINFLAG - - return flag_reserved_bytes; -} diff --git a/dtool/src/dtoolbase/deletedBufferChain.cxx b/dtool/src/dtoolbase/deletedBufferChain.cxx index 33e5672949..d02f10ead0 100644 --- a/dtool/src/dtoolbase/deletedBufferChain.cxx +++ b/dtool/src/dtoolbase/deletedBufferChain.cxx @@ -25,17 +25,10 @@ DeletedBufferChain:: DeletedBufferChain(size_t buffer_size) { _deleted_chain = NULL; _buffer_size = buffer_size; - _alloc_size = _buffer_size; - -#ifdef USE_DELETEDCHAINFLAG - // In development mode, we also need to reserve space for _flag. - _alloc_size += get_flag_reserved_bytes(); -#endif // USE_DELETEDCHAINFLAG // We must allocate at least this much space for bookkeeping // reasons. _buffer_size = max(_buffer_size, sizeof(ObjectNode)); - _alloc_size = max(_alloc_size, sizeof(ObjectNode)); } //////////////////////////////////////////////////////////////////// @@ -51,6 +44,9 @@ allocate(size_t size, TypeHandle type_handle) { //TAU_PROFILE("void *DeletedBufferChain::allocate(size_t, TypeHandle)", " ", TAU_USER); assert(size <= _buffer_size); + // Determine how much space to allocate. + const size_t alloc_size = _buffer_size + flag_reserved_bytes; + ObjectNode *obj; _lock.acquire(); @@ -67,8 +63,8 @@ allocate(size_t size, TypeHandle type_handle) { void *ptr = node_to_buffer(obj); #ifdef DO_MEMORY_USAGE - // type_handle.dec_memory_usage(TypeHandle::MC_deleted_chain_inactive, _alloc_size); - type_handle.inc_memory_usage(TypeHandle::MC_deleted_chain_active, _alloc_size); + // type_handle.dec_memory_usage(TypeHandle::MC_deleted_chain_inactive, alloc_size); + type_handle.inc_memory_usage(TypeHandle::MC_deleted_chain_active, alloc_size); #endif // DO_MEMORY_USAGE return ptr; @@ -78,7 +74,7 @@ allocate(size_t size, TypeHandle type_handle) { // If we get here, the deleted_chain is empty; we have to allocate a // new object from the system pool. - obj = (ObjectNode *)NeverFreeMemory::alloc(_alloc_size); + obj = (ObjectNode *)NeverFreeMemory::alloc(alloc_size); #ifdef USE_DELETEDCHAINFLAG obj->_flag = DCF_alive; @@ -87,7 +83,7 @@ allocate(size_t size, TypeHandle type_handle) { void *ptr = node_to_buffer(obj); #ifdef DO_MEMORY_USAGE - type_handle.inc_memory_usage(TypeHandle::MC_deleted_chain_active, _alloc_size); + type_handle.inc_memory_usage(TypeHandle::MC_deleted_chain_active, alloc_size); #endif // DO_MEMORY_USAGE return ptr; @@ -110,8 +106,10 @@ deallocate(void *ptr, TypeHandle type_handle) { assert(ptr != (void *)NULL); #ifdef DO_MEMORY_USAGE - type_handle.dec_memory_usage(TypeHandle::MC_deleted_chain_active, _alloc_size); - // type_handle.inc_memory_usage(TypeHandle::MC_deleted_chain_inactive, _alloc_size); + type_handle.dec_memory_usage(TypeHandle::MC_deleted_chain_active, + _buffer_size + flag_reserved_bytes); + // type_handle.inc_memory_usage(TypeHandle::MC_deleted_chain_inactive, + // _buffer_size + flag_reserved_bytes); #endif // DO_MEMORY_USAGE diff --git a/dtool/src/dtoolbase/deletedBufferChain.h b/dtool/src/dtoolbase/deletedBufferChain.h index 07825423ed..301ee5d297 100644 --- a/dtool/src/dtoolbase/deletedBufferChain.h +++ b/dtool/src/dtoolbase/deletedBufferChain.h @@ -93,13 +93,24 @@ private: static INLINE void *node_to_buffer(ObjectNode *node); static INLINE ObjectNode *buffer_to_node(void *buffer); - static INLINE size_t get_flag_reserved_bytes(); ObjectNode *_deleted_chain; MutexImpl _lock; size_t _buffer_size; - size_t _alloc_size; + +#ifndef USE_DELETEDCHAINFLAG + // Without DELETEDCHAINFLAG, we don't even store the _flag member at all. + static const size_t flag_reserved_bytes = 0; + +#elif defined(LINMATH_ALIGN) + // With SSE2 alignment, we need all 16 bytes to preserve alignment. + static const size_t flag_reserved_bytes = 16; + +#else + // Otherwise, we only need enough space for the Integer itself. + static const size_t flag_reserved_bytes = sizeof(AtomicAdjust::Integer); +#endif // USE_DELETEDCHAINFLAG friend class MemoryHook; };