complete code in ./site/content/chapter9/code/vm/mm.9.17.c
--- mm.c 2021-02-25 07:26:33.315926002 +0000
+++ mm.9.17.c 2021-02-25 07:26:33.315926002 +0000
@@ -41,6 +41,7 @@
/* Global variables */
static char *heap_listp = 0; /* Pointer to first block */
+static char *rover; /* Next fit rover */
/* Function prototypes for internal helper routines */
static void *extend_heap(size_t words);
@@ -69,6 +70,7 @@
heap_listp += (2*WSIZE); //line:vm:mm:endinit
/* $end mminit */
+ rover = heap_listp;
/* $begin mminit */
/* Extend the empty heap with a free block of CHUNKSIZE bytes */
@@ -177,6 +179,10 @@
bp = PREV_BLKP(bp);
}
/* $end mmfree */
+ /* Make sure the rover isn't pointing into the free block */
+ /* that we just coalesced */
+ if ((rover > (char *)bp) && (rover < NEXT_BLKP(bp)))
+ rover = bp;
/* $begin mmfree */
return bp;
}
@@ -290,16 +296,20 @@
{
/* $end mmfirstfit */
- /* $begin mmfirstfit */
- /* First-fit search */
- void *bp;
-
- for (bp = heap_listp; GET_SIZE(HDRP(bp)) > 0; bp = NEXT_BLKP(bp)) {
- if (!GET_ALLOC(HDRP(bp)) && (asize <= GET_SIZE(HDRP(bp)))) {
- return bp;
- }
- }
- return NULL; /* No fit */
+ /* Next fit search */
+ char *oldrover = rover;
+
+ /* Search from the rover to the end of list */
+ for ( ; GET_SIZE(HDRP(rover)) > 0; rover = NEXT_BLKP(rover))
+ if (!GET_ALLOC(HDRP(rover)) && (asize <= GET_SIZE(HDRP(rover))))
+ return rover;
+
+ /* search from start of list to old rover */
+ for (rover = heap_listp; rover < oldrover; rover = NEXT_BLKP(rover))
+ if (!GET_ALLOC(HDRP(rover)) && (asize <= GET_SIZE(HDRP(rover))))
+ return rover;
+
+ return NULL; /* no fit found */
}
/* $end mmfirstfit */