diff --git a/mm.c b/mm.c index 85b88af0a1891e4c2aadcbdce6456877f758dce0..c460e195761d449a18baca8e20a93870b873cb7e 100644 --- a/mm.c +++ b/mm.c @@ -641,16 +641,32 @@ static void *find_fit(size_t asize) return NULL; } - /* first fit search */ + /* Next fit search */ void *bp = free_listp; + void *bestP = bp; + void *first = NULL; + short flag = 0; do { - if (asize <= GET_SIZE(HDRP(bp))) { - return bp; - } - if((bp = GET_NEXT_FREE(bp)) == NULL){ - return NULL; + if (GET_SIZE(HDRP(bp)) >= asize) { + if(GET_SIZE(HDRP(bestP)) > GET_SIZE(HDRP(bp))){ + bestP = bp; + flag++; + } + if(!flag){ + first = bp; + flag = 1; + } + if(flag == 2){ + break; + } } + bp = GET_PREV_FREE(bp); } while(bp != free_listp); + if(asize <= GET_SIZE(HDRP(bestP))){ + return bestP; + } else if(first != NULL){ + return first; + } return NULL; /* no fit */ }