Beispiel #1
0
//
// coalesce - boundary tag coalescing. Return ptr to coalesced block
//
static void *coalesce(void *bp)
{
  FL_Pointer prev = PREV_BLKP(bp);
  FL_Pointer next = NEXT_BLKP(bp);

  size_t prev_alloc = GET_ALLOC(FTRP(prev));
  size_t next_alloc = GET_ALLOC(HDRP(next));
  size_t size = GET_SIZE(HDRP(bp));

  //CASE 1 : Both neighbors are allocated
  if (prev_alloc && next_alloc) {
    // we need to add free list node here b/c we do not do it in mm_free
    CL_append(&free_list, bp);
  }

  //CASE 2 : Only next free
  else if (prev_alloc && !next_alloc) {

    // unlink node thats next, b/c our current position will be beggining of new free node
    CL_unlink(next);
    CL_append(&free_list, bp);

    size += GET_SIZE(HDRP(next));
    PUT(HDRP(bp), PACK(size,0));
    PUT(FTRP(bp), PACK(size,0));
  }

  //CASE 3 : Only prev free
  else if (!prev_alloc && next_alloc){
    size += GET_SIZE(HDRP(prev));

    // no need to make new here b/c one exists at prev_node
    PUT(FTRP(bp), PACK(size,0));
    PUT(HDRP(prev), PACK(size,0));
    bp = prev;
  }

  //CASE 4 : both neighbors unallocated
  else {
    size += GET_SIZE(HDRP(prev))
      + GET_SIZE(FTRP(next));

    // unlink node that is above us, we can ignore the one below us because that
    // will serve ad the head for this free block
    CL_unlink(next);
    PUT(HDRP(prev), PACK(size,0));
    PUT(FTRP(next), PACK(size,0));
    bp = prev;

  }

  return bp;
}
Beispiel #2
0
//
//
// Practice problem 9.9
//
// 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(void *bp, size_t asize)
{
	size_t csize = GET_SIZE(HDRP(bp));
	
	if((csize - asize) >= (2 * DSIZE)) {
		CL_unlink(bp);
		PUT(HDRP(bp), PACK(asize, 1));
		PUT(FTRP(bp), PACK(asize, 1));
		bp = NEXT_BLKP(bp);
		PUT(HDRP(bp), PACK(csize - asize, 0));
		PUT(FTRP(bp), PACK(csize - asize, 0));
		CL_tack(&free_list, bp);
	}

	else {
		CL_unlink(bp);
		PUT(HDRP(bp), PACK(csize, 1));
		PUT(FTRP(bp), PACK(csize, 1));
	}
}
Beispiel #3
0
//
// coalesce - boundary tag coalescing. Return ptr to coalesced block
//
static void *coalesce(void *bp)
{
	FL_Pointer prev = PREV_BLKP(bp);
	FL_Pointer next = NEXT_BLKP(bp);
	
	size_t prev_alloc = GET_ALLOC(FTRP(prev));
	size_t next_alloc = GET_ALLOC(HDRP(next));
	size_t size = GET_SIZE(HDRP(bp));
	
	if (prev_alloc && next_alloc) {
		CL_tack(&free_list, bp); // case 1 neighbours = 1  add a return?
	}
	
	else if (prev_alloc && !next_alloc) { // case 2 next is free
		CL_unlink(next);
		CL_tack(&free_list, bp);
		
		size += GET_SIZE(HDRP(next));
		PUT(HDRP(bp), PACK(size, 0));
		PUT(FTRP(bp), PACK(size, 0));
	}
	
	else if (!prev_alloc && next_alloc) { // case 3 prev is free
		size += GET_SIZE(HDRP(prev));
		PUT(FTRP(bp), PACK(size, 0));
		PUT(HDRP(prev), PACK(size, 0));
		bp = prev;
	}

	else { // both next and prev free
		size += GET_SIZE(HDRP(prev)) + GET_SIZE(FTRP(next));
		CL_unlink(next);
		PUT(HDRP(prev), PACK(size, 0 ));
		PUT(FTRP(next), PACK(size, 0));
		bp = prev;
	}
	
	return bp;
}