static void releaseMemory(struct Allocator_pvt* context, Allocator_Provider provider, Allocator_Provider_CONTEXT_TYPE* providerCtx) { // Free all of the allocations including the one which holds the allocator. #ifdef PARANOIA unsigned long allocatedHere = context->allocatedHere; #endif Identity_check(context->rootAlloc)->spaceAvailable += context->allocatedHere; struct Allocator_Allocation_pvt* loc = context->allocations; while (loc != NULL) { #ifdef PARANOIA allocatedHere -= loc->pub.size; #endif struct Allocator_Allocation_pvt* nextLoc = loc->next; releaseAllocation(context, loc, provider, providerCtx); loc = nextLoc; } #ifdef PARANOIA Assert_true(allocatedHere == 0); #endif }
void AllocationRenderController::releaseEvent(DFBTracingPacket packet) { DFBTracingBufferData* data = &packet.Payload.buffer; SceneController *scene = m_controllerSceneMap.value(data->poolId); if (scene) releaseAllocation(scene, data); }
void* Allocator__realloc(struct Allocator* allocator, const void* original, unsigned long size, const char* fileName, int lineNum) { if (original == NULL) { return Allocator__malloc(allocator, size, fileName, lineNum); } struct Allocator_pvt* context = Identity_check((struct Allocator_pvt*) allocator); check(context); struct Allocator_Allocation_pvt** locPtr = &context->allocations; struct Allocator_Allocation_pvt* origLoc = ((struct Allocator_Allocation_pvt*) original) - 1; for (;;) { struct Allocator_Allocation_pvt* loc = *locPtr; if (loc == NULL) { failure(context, "Reallocation of memory which was not allocated using this allocator.", fileName, lineNum); } checkCanaries(loc, context); if (loc == origLoc) { break; } locPtr = &loc->next; } struct Allocator_Allocation_pvt* nextLoc = origLoc->next; if (size == 0) { // realloc(0) means free() *locPtr = nextLoc; Assert_true(origLoc->pub.size <= context->allocatedHere); context->rootAlloc->spaceAvailable += origLoc->pub.size; context->allocatedHere -= origLoc->pub.size; releaseAllocation(context, origLoc, context->rootAlloc->provider, context->rootAlloc->providerContext); check(context); return NULL; } size_t realSize = getRealSize(size); if (context->rootAlloc->spaceAvailable + origLoc->pub.size < realSize) { failure(context, "Out of memory, limit exceeded.", fileName, lineNum); } context->rootAlloc->spaceAvailable += origLoc->pub.size; context->rootAlloc->spaceAvailable -= realSize; context->allocatedHere -= origLoc->pub.size; context->allocatedHere += realSize; struct Allocator_Allocation_pvt* alloc = context->rootAlloc->provider(context->rootAlloc->providerContext, &origLoc->pub, realSize, allocator); if (alloc == NULL) { failure(context, "Out of memory, realloc() returned NULL.", fileName, lineNum); } alloc->next = nextLoc; alloc->pub.size = realSize; *locPtr = alloc; setCanaries(alloc, context); check(context); return (void*) (alloc + 1); }