Esempio n. 1
0
/*
 * place - Place block of asize bytes at start of free block bp
 *         and split if remainder would be at least minimum block size
 *         
 *  given a free block, removes free block from list and updates all relevant pointers 
 *
 */
static void place(void* bp, size_t asize) {

	size_t old_size = GET_SIZE(HDRP(bp));
	size_t prev_alloc = GET_PREV_ALLOC(HDRP(bp));
	size_t temp_value;

	dbg1("[IN ] : place()\n");

	/* remove free block from free list */
	remove_free_block(bp);

	/* check to see if block can be split up */

	dbg1("old_size=%ld, asize=%ld, compare=%d\n", old_size, asize, (int) OVERHEAD+2*DSIZE);
	
	if (old_size - asize >= OVERHEAD + 2*DSIZE) {

		/* block can be split up */
		PUT(HDRP(bp), PACK(asize, prev_alloc | 0x1));
		PUT(HDRP(NEXT_BLKP(bp)), PACK( old_size - asize, 0x2 ));
		PUT(FTRP(NEXT_BLKP(bp)), PACK( old_size - asize, 0x2 ));

		insert_free_block(NEXT_BLKP(bp));
	}
	else {
		/* just use entire block */
		PUT(HDRP(bp), PACK(old_size, prev_alloc | 0x1));
		temp_value = GET(HDRP(NEXT_BLKP(bp))) | 0x2;
		PUT(HDRP(NEXT_BLKP(bp)), temp_value);
	}

	dbg1("[OUT] : place()\n");

}
Esempio n. 2
0
/*
 * place - Place block of asize bytes at start of free block bp
 *		 and split if remainder would be at least minimum block size
 */
static void place(block_ptr bp, size_t asize)
{
	size_t csize = GET_SIZE(HDRP(bp)), delta = csize - asize;

	if (delta >= (2 * DSIZE))
	{
		PUT(HDRP(bp), PACK(asize, 1));
		PUT(FTRP(bp), PACK(asize, 1));
		SET_ALLOC(bp);
		bp = NEXT_BLKP(bp);
		PUT(HDRP(bp), PACK(delta, 0));
		PUT(FTRP(bp), PACK(delta, 0));
		SET_UNALLOC(bp);
		reset_block(bp);
		insert_free_block(bp, delta);
#ifdef DEBUG
		{
			printf("Block with size %zu remains a block:\n", asize);
			printblock(bp);
		}
#endif
	}
	else
	{
		PUT(HDRP(bp), PACK(csize, 1));
		PUT(FTRP(bp), PACK(csize, 1));
		SET_ALLOC(bp);
	}
}
Esempio n. 3
0
/*
 * place
 */
static void place(void *bp, size_t asize){  
	size_t csize = GET_SIZE(HDRP(bp));
	
	if ((csize - asize) >= (2*DSIZE)) {  
		delete_free_block(bp);
		PUT(HDRP(bp), PACK(asize, 1));
		PUT(FTRP(bp), PACK(asize, 1));
		
		PUT(NEXT_BLKP(bp), PREV_F_BLKP(bp));
		PUT(NEXT_BLKP(bp) + WSIZE, NEXT_F_BLKP(bp));
		
		dbg_printf("place: %d to %d\n",(int)(HDRP(bp)-heap_listp),(int)(FTRP(bp)-heap_listp+WSIZE));
		
		bp = NEXT_BLKP(bp);
		PUT(HDRP(bp), PACK(csize - asize, 0));
		PUT(FTRP(bp), PACK(csize - asize, 0));
		
		insert_free_block(bp);
	}
	else{
		PUT(HDRP(bp), PACK(csize, 1));
		PUT(FTRP(bp), PACK(csize, 1));
		delete_free_block(bp);
	}
}
Esempio n. 4
0
void grow_heap(size_t min_size)
{
	struct block_header *block;
	size_t grow_size;
	void *new_space;

	grow_size = ((min_size + BRK_SIZE - 1) / BRK_SIZE) * BRK_SIZE;

	new_space = sbrk(grow_size);
	memset((void*) new_space, UNALLOCED_FILL, grow_size);
	block = (struct block_header*) new_space;
	block->size = grow_size;
	block->magic = FREE_MAGIC;
	insert_free_block(block);

	total_space_used += grow_size;
}
Esempio n. 5
0
void __free_internal(void *address)
{
	struct block_header *header;

	if (address == 0)
		return;

	assert(allocated_blocks > 0);
	header = (struct block_header*) ((unsigned) address - MALLOCED_HEADER_SIZE);
	assert(header->magic == MALLOCED_MAGIC)
	memset((void*)((unsigned) header + sizeof(struct block_header)), FREE_FILL,
		header->size - sizeof(struct block_header));
	header->magic = FREE_MAGIC;

	allocated_blocks--;
	total_allocated -= header->size;
	insert_free_block(header);
}
Esempio n. 6
0
/*
 * coalesce
 */
static void *coalesce(void *bp){
	size_t prev_alloc = GET_ALLOC(FTRP(PREV_BLKP(bp)));
	size_t next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(bp)));
	size_t size = GET_SIZE(HDRP(bp));
	
	/*prev and next block are allocated*/
	if(prev_alloc && next_alloc){ 	
		//insert_free_block(bp);
		//return bp;
	}
	/* next block is free */
	else if(prev_alloc && !next_alloc){ 	
		delete_free_block(NEXT_BLKP(bp));
		size += GET_SIZE(HDRP(NEXT_BLKP(bp)));
		PUT(HDRP(bp),PACK(size,0));
		PUT(FTRP(bp),PACK(size,0));
		//insert_free_block(bp);
	}
	/* prev block is free */
	else if(!prev_alloc && next_alloc){ 	
		delete_free_block(PREV_BLKP(bp));
		size += GET_SIZE(HDRP(PREV_BLKP(bp)));
		PUT(FTRP(bp),PACK(size,0));
		PUT(HDRP(PREV_BLKP(bp)), PACK(size,0));
		bp = PREV_BLKP(bp);
		//insert_free_block(bp);
	}
	/*prev and next are free*/
	else{ 	
		delete_free_block(PREV_BLKP(bp));
		delete_free_block(NEXT_BLKP(bp));
		size += GET_SIZE(HDRP(PREV_BLKP(bp))) + GET_SIZE(FTRP(NEXT_BLKP(bp)));
		PUT(HDRP(PREV_BLKP(bp)), PACK(size,0));
		PUT(FTRP(NEXT_BLKP(bp)), PACK(size,0));
		bp = PREV_BLKP(bp);
		//insert_free_block(bp);
	}
	insert_free_block(bp);	
	return bp;
}
Esempio n. 7
0
/*
 * free
 */
void free(block_ptr ptr)
{
	block_ptr tmp;
	size_t size;
	if (!ptr || !in_heap(ptr) || !aligned(ptr))
		return;

#ifdef DEBUG
	{
		printf("\nFree request: ptr = %p \033[41;37m[ID:%d]\033[0m\n", ptr, operid++);
		printblock(ptr);
	}
#endif

	size = GET_SIZE(HDRP(ptr));
	PUT(HDRP(ptr), PACK(size, 0));
	PUT(FTRP(ptr), PACK(size, 0));
	SET_UNALLOC(ptr);
	reset_block(ptr);
	tmp = coalesce(ptr);
	insert_free_block(tmp, GET_SIZE(HDRP(tmp)));
}
Esempio n. 8
0
/* 
 * coalesce - boundary tag coalescing. return ptr to coalesced block
 *
 */
static void* coalesce(void* bp) {

	size_t prev_alloc = GET_PREV_ALLOC(HDRP(bp));
	size_t next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(bp)));
	size_t size = GET_SIZE(HDRP(bp));

	dbg1("[IN ] : coalesce()\n");

	switch (prev_alloc | next_alloc)
	{
		case 3:
			/* neither of the adjacent blocks are free */
			insert_free_block(bp);
			dbg1("[OUT] : coalesce() : neither of the adjacent blocks are free.\n");
			return bp;
		case 2:
			/* next block is free */
			size += GET_SIZE(HDRP(NEXT_BLKP(bp)));

			/* remove next block from free list */
			remove_free_block(NEXT_BLKP(bp));

			/* update header and footer pointers */
			PUT(HDRP(bp), PACK(size, prev_alloc));
			PUT(FTRP(bp), PACK(size, prev_alloc));

			/* insert new merged block into free list */
			insert_free_block(bp);
			dbg1("[OUT] : coalesce() : next block is free - merged \n");
			return(bp);
		case 1:
			/* prev block is free */
			size += GET_SIZE(HDRP(PREV_BLKP(bp)));

			/* remove this block from free list */
			remove_free_block(PREV_BLKP(bp));

			/* update header and footer pointers */
			prev_alloc = GET_PREV_ALLOC(HDRP(PREV_BLKP(bp)));
			PUT(FTRP(bp), PACK(size, prev_alloc));
			PUT(HDRP(PREV_BLKP(bp)), PACK(size, prev_alloc));

			/* insert new merged block into free list */
			insert_free_block(PREV_BLKP(bp));
			dbg1("[OUT] : coalesce() : previous block is free - merged \n");
			return(PREV_BLKP(bp));
		default:
			/* both previous and next blocks are free */
			size += GET_SIZE(HDRP(PREV_BLKP(bp))) + GET_SIZE(FTRP(NEXT_BLKP(bp)));

			/* remove next block from free list */
			remove_free_block(NEXT_BLKP(bp));

			/* remove this block from free list */
			remove_free_block(PREV_BLKP(bp));

			/* update header and footer pointers */
			prev_alloc = GET_PREV_ALLOC(HDRP(PREV_BLKP(bp)));
			PUT(HDRP(PREV_BLKP(bp)), PACK(size, prev_alloc));
			PUT(FTRP(NEXT_BLKP(bp)), PACK(size, prev_alloc));

			/* insert new merged block into free list */
			insert_free_block(PREV_BLKP(bp));

			dbg1("[OUT] : coalesce() : both previous and next blocks are free - merged \n");
			
			return(PREV_BLKP(bp));
	}
}