// // 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; }
// // // 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)); } }
// // 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; }