void removeFromFreeList( heapAllocator* heap, block* b ) { //validateFreeList( heap ); block* const pFree = prevFree( b ); block* const nFree = nextFree( b ); //printf( "prev: " xPTRf ", next: " xPTRf "\n", (uintptr_t)pFree, (uintptr_t)nFree ); //vAssert( nFree || pFree ); if ( pFree ) { vAssert( pFree->free ); //vAssert( nFree || pFree->prevFree ); setNextFree( pFree, nFree ); } else { vAssert( heap->free == b ); if (!nFree ) { block* bl = heap->first; while (bl) { vAssert( bl == b || !bl->free ); bl = bl->next; } } heap->free = nFree; } if ( nFree ) { vAssert( nFree->free ); setPrevFree( nFree, pFree ); } setNextFree( b, NULL ); setPrevFree( b, NULL ); b->free = false; //validateFreeList( heap ); b->free = true; }
void addToFreeList( heapAllocator* heap, block* b ) { b->free = true; block* oldFree = heap->free; vAssert( oldFree != b ); setNextFree( b, oldFree ); vAssert( oldFree != b ); vAssert( oldFree == NULL || prevFree( oldFree ) == NULL ); // It should have been first in the list setPrevFree( oldFree, b ); heap->free = b; setPrevFree( b, NULL ); }
/* coalesce free blocks */ static void *coalesce(void *bp){ size_t prevAllocBit = getPrevAlloc(getHeader(bp)); size_t nextAllocBit = getAlloc(getHeader(nextBlock(bp))); size_t size = getSize(getHeader(bp)); size_t index; size_t prevPAlloc; /* both the previous and next block allocated */ if (prevAllocBit && nextAllocBit) { setPrevFree(getHeader(nextBlock(bp))); } /* Only previous block is free */ else if (!prevAllocBit && nextAllocBit) { size += getSize(getHeader(prevBlock(bp))); prevPAlloc = getPrevAlloc(getHeader(prevBlock(bp))); deleteListNode(prevBlock(bp)); put(getFooter(bp), size); bp = prevBlock(bp); put(getHeader(bp), pack(size, prevPAlloc, 0)); setPrevFree(getHeader(nextBlock(bp))); } /* Only next block is free */ else if (prevAllocBit && !nextAllocBit) { size += getSize(getHeader(nextBlock(bp))); deleteListNode(nextBlock(bp)); put(getHeader(bp), pack(size, prevAllocBit, 0)); put(getFooter(bp), size); } /* Both previous and next block are free */ else { size += getSize(getHeader(prevBlock(bp))) + getSize(getFooter(nextBlock(bp))); prevPAlloc = getPrevAlloc(getHeader(prevBlock(bp))); deleteListNode(nextBlock(bp)); deleteListNode(prevBlock(bp)); put(getHeader(prevBlock(bp)), pack(size, prevPAlloc, 0)); put(getFooter(nextBlock(bp)), size); bp = prevBlock(bp); } index = getIndex(size); insertListNode(bp, index); return bp; }