void* ArenaGrow(ArenaPool *pool, void *p, unsigned int size, unsigned int incr) { void *newp; ARENA_ALLOCATE(newp, pool, size + incr); if (newp) memcpy(newp, p, size); return newp; }
void* RenderArena::allocate(size_t size) { m_totalSize += size; #ifdef ADDRESS_SANITIZER return ::malloc(size); #elif !defined(NDEBUG) // Use standard malloc so that memory debugging tools work. ASSERT(this); void* block = ::malloc(debugHeaderSize + size); RenderArenaDebugHeader* header = static_cast<RenderArenaDebugHeader*>(block); header->arena = this; header->size = size; header->signature = signature; return static_cast<char*>(block) + debugHeaderSize; #else void* result = 0; // Ensure we have correct alignment for pointers. Important for Tru64 size = ROUNDUP(size, sizeof(void*)); // Check recyclers first if (size < gMaxRecycledSize) { const int index = size >> 2; result = m_recyclers[index]; if (result) { // Need to move to the next object void* next = *((void**)result); m_recyclers[index] = next; } } if (!result) { // Allocate a new chunk from the arena unsigned bytesAllocated = 0; ARENA_ALLOCATE(result, &m_pool, size, &bytesAllocated); m_totalAllocated += bytesAllocated; } return result; #endif }
void* RenderArena::allocate(size_t size) { #ifndef NDEBUG // Use standard malloc so that memory debugging tools work. assert(this); void* block = ::malloc(sizeof(RenderArenaDebugHeader) + size); RenderArenaDebugHeader* header = (RenderArenaDebugHeader*)block; header->arena = this; header->size = size; header->signature = signature; return header + 1; #else void* result = 0; // Ensure we have correct alignment for pointers. Important for Tru64 size = ROUNDUP(size, sizeof(void*)); // Check recyclers first if (size < gMaxRecycledSize) { const int index = size >> 2; result = m_recyclers[index]; if (result) { // Need to move to the next object void* next = *((void**)result); m_recyclers[index] = next; } } if (!result) { // Allocate a new chunk from the arena ARENA_ALLOCATE(result, &m_pool, size); } return result; #endif }