Example #1
0
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;
}
Example #2
0
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;
}