Implicit - next_fit

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <string.h>
#include "mm.h"
#include "memlib.h"
team_t team = {
"ateam",
"Harry Bovik",
"bovik@cs.cmu.edu",
"",
""
};
#define ALIGNMENT 8
#define ALIGN(size) (((size) + (ALIGNMENT-1)) & ~0x7)
#define SIZE_T_SIZE (ALIGN(sizeof(size_t)))
#define WSIZE 4
#define DSIZE 8
#define CHUNKSIZE (1<<12)
#define MAX(x, y) ((x) > (y)? (x) : (y))
#define PACK(size, alloc) ((size) | (alloc))
#define GET(p) (*(unsigned int *)(p))
#define PUT(p, val) (*(unsigned int *)(p) = (val))
#define GET_SIZE(p) (GET(p) & ~0x7)
#define GET_ALLOC(p) (GET(p) & 0x1)
#define HDRP(bp) ((char *)(bp) - WSIZE)
#define FTRP(bp) ((char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE)
#define NEXT_BLKP(bp) ((char *)(bp) + GET_SIZE(((char *)(bp) - WSIZE)))
#define PREV_BLKP(bp) ((char *)(bp) - GET_SIZE(((char *)(bp) - DSIZE)))
typedef void * (*fit_policy_t)(size_t asize);
static char *heap_listp;
static char *next_fit_p = NULL;
static void *coalesce_for_next_fit(void *bp);
static void *extend_heap(size_t words);
static void *find_fit(size_t asize, fit_policy_t fit_policy);
static void *next_fit(size_t asize);
static void place_for_next_fit(void *bp, size_t asize);
int mm_init(void) {
if ((heap_listp = mem_sbrk(4 * WSIZE)) == (void *) -1)
return -1;
PUT(heap_listp, 0);
PUT(heap_listp + (1*WSIZE), PACK(DSIZE, 1));
PUT(heap_listp + (2*WSIZE), PACK(DSIZE, 1));
PUT(heap_listp + (3*WSIZE), PACK(0, 1));
heap_listp += (2 * WSIZE);
if (extend_heap(CHUNKSIZE / WSIZE) == NULL)
return -1;
return 0;
}
void *mm_malloc(size_t size) {
size_t asize;
size_t extendsize;
char *bp;
if (size == 0)
return NULL;
if (size <= DSIZE)
asize = 2 * DSIZE;
else
asize = DSIZE * ((size + (DSIZE) + (DSIZE - 1)) / DSIZE);
if ((bp = find_fit(asize, next_fit)) != NULL) {
place_for_next_fit(bp, asize);
return bp;
}
extendsize = MAX(asize, CHUNKSIZE);
if ((bp = extend_heap(extendsize / WSIZE)) == NULL)
return NULL;
place_for_next_fit(bp, asize);
return bp;
}
void mm_free(void *bp) {
size_t size = GET_SIZE(HDRP(bp));
PUT(HDRP(bp), PACK(size, 0));
PUT(FTRP(bp), PACK(size, 0));
coalesce_for_next_fit(bp);
}
void *mm_realloc(void *ptr, size_t size) {
void *oldptr = ptr;
void *newptr;
newptr = mm_malloc(size);
if (newptr == NULL)
return NULL;
size_t copysize = GET_SIZE(HDRP(ptr)) - DSIZE;
if (size < copysize) {
copysize = size;
}
memcpy(newptr, oldptr, copysize);
mm_free(oldptr);
return newptr;
}
static void *extend_heap(size_t words) {
char *bp;
size_t size;
size = (words % 2) ? (words + 1) * WSIZE : words * WSIZE;
if ((long) (bp = mem_sbrk(size)) == -1)
return NULL;
PUT(HDRP(bp), PACK(size, 0));
PUT(FTRP(bp), PACK(size, 0));
PUT(HDRP(NEXT_BLKP(bp)), PACK(0, 1));
return coalesce_for_next_fit(bp);
}
static void *coalesce_for_next_fit(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));
void *orig_bp = bp;
void *next_bp = NEXT_BLKP(bp);
if (prev_alloc && next_alloc) {
}
else if (prev_alloc && !next_alloc) {
size += GET_SIZE(HDRP(NEXT_BLKP(bp)));
PUT(HDRP(bp), PACK(size, 0));
PUT(FTRP(bp), PACK(size, 0));
}
else if (!prev_alloc && next_alloc) {
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);
}
else {
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);
}
if ((next_fit_p != NULL) && (next_fit_p == orig_bp || next_fit_p == next_bp)) {
next_fit_p = bp;
}
return bp;
}
static void *next_fit(size_t asize) {
void *bp;
char *start_p;
if (next_fit_p == NULL) {
next_fit_p = heap_listp;
}
start_p = next_fit_p;
for (bp = start_p; GET_SIZE(HDRP(bp)) > 0; bp = NEXT_BLKP(bp)) {
if (!GET_ALLOC(HDRP(bp)) && (asize <= GET_SIZE(HDRP(bp)))) {
return bp;
}
}
for (bp = heap_listp; bp < start_p; bp = NEXT_BLKP(bp)) {
if (!GET_ALLOC(HDRP(bp)) && (asize <= GET_SIZE(HDRP(bp)))) {
return bp;
}
}
return NULL;
}
static void *find_fit(size_t asize, fit_policy_t fit_policy) {
return fit_policy(asize);
}
static void place_for_next_fit(void *bp, size_t asize) {
size_t csize = GET_SIZE(HDRP(bp));
if ((csize - asize) >= (2 * DSIZE)) {
PUT(HDRP(bp), PACK(asize, 1));
PUT(FTRP(bp), PACK(asize, 1));
void *next_bp = NEXT_BLKP(bp);
PUT(HDRP(next_bp), PACK(csize - asize, 0));
PUT(FTRP(next_bp), PACK(csize - asize, 0));
next_fit_p = next_bp;
} else {
PUT(HDRP(bp), PACK(csize, 1));
PUT(FTRP(bp), PACK(csize, 1));
next_fit_p = NEXT_BLKP(bp);
}
}
Implicit - best_fit

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <string.h>
#include "mm.h"
#include "memlib.h"
team_t team = {
"ateam",
"Harry Bovik",
"bovik@cs.cmu.edu",
"",
""
};
#define ALIGNMENT 8
#define ALIGN(size) (((size) + (ALIGNMENT-1)) & ~0x7)
#define SIZE_T_SIZE (ALIGN(sizeof(size_t)))
#define WSIZE 4
#define DSIZE 8
#define CHUNKSIZE (1<<12)
#define MAX(x, y) ((x) > (y)? (x) : (y))
#define PACK(size, alloc) ((size) | (alloc))
#define GET(p) (*(unsigned int *)(p))
#define PUT(p, val) (*(unsigned int *)(p) = (val))
#define GET_SIZE(p) (GET(p) & ~0x7)
#define GET_ALLOC(p) (GET(p) & 0x1)
#define HDRP(bp) ((char *)(bp) - WSIZE)
#define FTRP(bp) ((char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE)
#define NEXT_BLKP(bp) ((char *)(bp) + GET_SIZE(((char *)(bp) - WSIZE)))
#define PREV_BLKP(bp) ((char *)(bp) - GET_SIZE(((char *)(bp) - DSIZE)))
typedef void* (*fit_policy_t)(size_t asize);
static char *heap_listp;
static void *coalesce(void *bp);
static void *extend_heap(size_t words);
static void *find_fit(size_t asize, fit_policy_t fit_policy);
static void * first_fit(size_t asize);
static void place(void *bp, size_t asize);
int mm_init(void) {
if ((heap_listp = mem_sbrk(4 * WSIZE)) == (void *) -1)
return -1;
PUT(heap_listp, 0);
PUT(heap_listp + (1*WSIZE), PACK(DSIZE, 1));
PUT(heap_listp + (2*WSIZE), PACK(DSIZE, 1));
PUT(heap_listp + (3*WSIZE), PACK(0, 1));
heap_listp += (2 * WSIZE);
if (extend_heap(CHUNKSIZE / WSIZE) == NULL)
return -1;
return 0;
}
void *mm_malloc(size_t size) {
size_t asize;
size_t extendsize;
char *bp;
if (size == 0)
return NULL;
if (size <= DSIZE)
asize = 2 * DSIZE;
else
asize = DSIZE * ((size + (DSIZE) + (DSIZE - 1)) / DSIZE);
if ((bp = find_fit(asize, first_fit)) != NULL) {
place(bp, asize);
return bp;
}
extendsize = MAX(asize, CHUNKSIZE);
if ((bp = extend_heap(extendsize / WSIZE)) == NULL)
return NULL;
place(bp, asize);
return bp;
}
void mm_free(void *bp) {
size_t size = GET_SIZE(HDRP(bp));
PUT(HDRP(bp), PACK(size, 0));
PUT(FTRP(bp), PACK(size, 0));
coalesce(bp);
}
void *mm_realloc(void *ptr, size_t size) {
void *oldptr = ptr;
void *newptr;
newptr = mm_malloc(size);
if (newptr == NULL)
return NULL;
size_t copysize = GET_SIZE(HDRP(ptr)) - DSIZE;
if (size < copysize) {
copysize = size;
}
memcpy(newptr, oldptr, copysize);
mm_free(oldptr);
return newptr;
}
static void *extend_heap(size_t words) {
char *bp;
size_t size;
size = (words % 2) ? (words + 1) * WSIZE : words * WSIZE;
if ((long) (bp = mem_sbrk(size)) == -1)
return NULL;
PUT(HDRP(bp), PACK(size, 0));
PUT(FTRP(bp), PACK(size, 0));
PUT(HDRP(NEXT_BLKP(bp)), PACK(0, 1));
return coalesce(bp);
}
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));
if (prev_alloc && next_alloc) {
return bp;
}
if (prev_alloc && !next_alloc) {
size += GET_SIZE(HDRP(NEXT_BLKP(bp)));
PUT(HDRP(bp), PACK(size, 0));
PUT(FTRP(bp), PACK(size, 0));
} else if (!prev_alloc && next_alloc) {
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);
} else {
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);
}
return bp;
}
static void * first_fit(size_t asize) {
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;
}
static void *find_fit(size_t asize, fit_policy_t fit_policy) {
return fit_policy(asize);
}
static void place(void *bp, size_t asize) {
size_t csize = GET_SIZE(HDRP(bp));
if ((csize - asize) >= (2 * DSIZE)) {
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));
} else {
PUT(HDRP(bp), PACK(csize, 1));
PUT(FTRP(bp), PACK(csize, 1));
}
}
Explicit - LIFO - first_fit

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <string.h>
#include "mm.h"
#include <limits.h>
#include "memlib.h"
team_t team = {
"ateam",
"Harry Bovik",
"bovik@cs.cmu.edu",
"",
""
};
#define ALIGNMENT 8
#define ALIGN(size) (((size) + (ALIGNMENT-1)) & ~0x7)
#define SIZE_T_SIZE (ALIGN(sizeof(size_t)))
#define WSIZE 4
#define DSIZE 8
#define CHUNKSIZE (1<<12)
#define MAX(x, y) ((x) > (y)? (x) : (y))
#define PACK(size, alloc) ((size) | (alloc))
#define GET(p) (*(unsigned int *)(p))
#define PUT(p, val) (*(unsigned int *)(p) = (val))
#define GET_SIZE(p) (GET(p) & ~0x7)
#define GET_ALLOC(p) (GET(p) & 0x1)
#define HDRP(bp) ((char *)(bp) - WSIZE)
#define FTRP(bp) ((char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE)
#define NEXT_BLKP(bp) ((char *)(bp) + GET_SIZE(((char *)(bp) - WSIZE)))
#define PREV_BLKP(bp) ((char *)(bp) - GET_SIZE(((char *)(bp) - DSIZE)))
#define PREDP(bp) (*(void **)(bp))
#define SUCCP(bp) (*(void **)(bp + WSIZE))
typedef void * (*fit_policy_t)(size_t asize);
static char *free_listp;
static char *heap_listp;
static void *coalesce_for_first_fit(void *bp);
static void *extend_heap(size_t words);
static void *find_fit(size_t asize, fit_policy_t fit_policy);
static void *first_fit(size_t asize);
static void place_for_first_fit(void *bp, size_t asize);
static void list_add(void *bp);
static void list_remove(void *bp);
int mm_init(void) {
if ((heap_listp = mem_sbrk(4 * WSIZE)) == (void *) -1)
return -1;
PUT(heap_listp, 0);
PUT(heap_listp + (1*WSIZE), PACK(DSIZE, 1));
PUT(heap_listp + (2*WSIZE), PACK(DSIZE, 1));
PUT(heap_listp + (3*WSIZE), PACK(0, 1));
heap_listp += (2 * WSIZE);
free_listp = NULL;
if (extend_heap(CHUNKSIZE / WSIZE) == NULL)
return -1;
return 0;
}
void *mm_malloc(size_t size) {
size_t asize;
size_t extendsize;
char *bp;
if (size == 0)
return NULL;
if (size <= DSIZE)
asize = 2 * DSIZE;
else
asize = DSIZE * ((size + (DSIZE) + (DSIZE - 1)) / DSIZE);
if ((bp = find_fit(asize, first_fit)) != NULL) {
place_for_first_fit(bp, asize);
return bp;
}
extendsize = MAX(asize, CHUNKSIZE);
if ((bp = extend_heap(extendsize / WSIZE)) == NULL)
return NULL;
place_for_first_fit(bp, asize);
return bp;
}
void mm_free(void *bp) {
size_t size = GET_SIZE(HDRP(bp));
PUT(HDRP(bp), PACK(size, 0));
PUT(FTRP(bp), PACK(size, 0));
coalesce_for_first_fit(bp);
}
void *mm_realloc(void *ptr, size_t size) {
void *oldptr = ptr;
void *newptr;
newptr = mm_malloc(size);
if (newptr == NULL)
return NULL;
size_t copysize = GET_SIZE(HDRP(ptr)) - DSIZE;
if (size < copysize) {
copysize = size;
}
memcpy(newptr, oldptr, copysize);
mm_free(oldptr);
return newptr;
}
static void *extend_heap(size_t words) {
char *bp;
size_t size;
size = (words % 2) ? (words + 1) * WSIZE : words * WSIZE;
if ((long) (bp = mem_sbrk(size)) == -1)
return NULL;
PUT(HDRP(bp), PACK(size, 0));
PUT(FTRP(bp), PACK(size, 0));
PUT(HDRP(NEXT_BLKP(bp)), PACK(0, 1));
return coalesce_for_first_fit(bp);
}
static void list_add(void *bp) {
PREDP(bp) = NULL;
SUCCP(bp) = free_listp;
if (free_listp != NULL) {
PREDP(free_listp) = bp;
}
free_listp = bp;
}
static void list_remove(void *bp) {
void *pred_bp = PREDP(bp);
void *succ_bp = SUCCP(bp);
if (pred_bp == NULL && succ_bp == NULL) {
free_listp = NULL;
} else if (pred_bp == NULL) {
PREDP(succ_bp) = NULL;
free_listp = succ_bp;
} else if (succ_bp == NULL) {
SUCCP(pred_bp) = NULL;
} else {
SUCCP(pred_bp) = succ_bp;
PREDP(succ_bp) = pred_bp;
}
}
static void *coalesce_for_first_fit(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));
if (prev_alloc && next_alloc) {
} else if (prev_alloc && !next_alloc) {
list_remove(NEXT_BLKP(bp));
size += GET_SIZE(HDRP(NEXT_BLKP(bp)));
PUT(HDRP(bp), PACK(size, 0));
PUT(FTRP(bp), PACK(size, 0));
} else if (!prev_alloc && next_alloc) {
list_remove(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);
} else {
list_remove(PREV_BLKP(bp));
list_remove(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);
}
list_add(bp);
return bp;
}
static void *first_fit(size_t asize) {
void *bp;
for (bp = free_listp; bp != NULL; bp = SUCCP(bp)){
if (asize <= GET_SIZE(HDRP(bp))) {
return bp;
}
}
return NULL;
}
static void *find_fit(size_t asize, fit_policy_t fit_policy) {
return fit_policy(asize);
}
static void place_for_first_fit(void *bp, size_t asize) {
size_t csize = GET_SIZE(HDRP(bp));
list_remove(bp);
if ((csize - asize) >= (2 * DSIZE)) {
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));
list_add(bp);
} else {
PUT(HDRP(bp), PACK(csize, 1));
PUT(FTRP(bp), PACK(csize, 1));
}
}
Explicit - LIFO - next_fit

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <string.h>
#include "mm.h"
#include <limits.h>
#include "memlib.h"
team_t team = {
"ateam",
"Harry Bovik",
"bovik@cs.cmu.edu",
"",
""
};
#define ALIGNMENT 8
#define ALIGN(size) (((size) + (ALIGNMENT-1)) & ~0x7)
#define SIZE_T_SIZE (ALIGN(sizeof(size_t)))
#define WSIZE 4
#define DSIZE 8
#define CHUNKSIZE (1<<12)
#define MAX(x, y) ((x) > (y)? (x) : (y))
#define PACK(size, alloc) ((size) | (alloc))
#define GET(p) (*(unsigned int *)(p))
#define PUT(p, val) (*(unsigned int *)(p) = (val))
#define GET_SIZE(p) (GET(p) & ~0x7)
#define GET_ALLOC(p) (GET(p) & 0x1)
#define HDRP(bp) ((char *)(bp) - WSIZE)
#define FTRP(bp) ((char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE)
#define NEXT_BLKP(bp) ((char *)(bp) + GET_SIZE(((char *)(bp) - WSIZE)))
#define PREV_BLKP(bp) ((char *)(bp) - GET_SIZE(((char *)(bp) - DSIZE)))
#define PREDP(bp) (*(void **)(bp))
#define SUCCP(bp) (*(void **)(bp + WSIZE))
typedef void * (*fit_policy_t)(size_t asize);
static char *free_listp;
static char *heap_listp;
static char *next_fit_p = NULL;
static void *coalesce_for_next_fit(void *bp);
static void *extend_heap(size_t words);
static void *find_fit(size_t asize, fit_policy_t fit_policy);
static void *next_fit(size_t asize);
static void place_for_next_fit(void *bp, size_t asize);
static void list_add(void *bp);
static void list_remove(void *bp);
int mm_init(void) {
if ((heap_listp = mem_sbrk(4 * WSIZE)) == (void *) -1)
return -1;
PUT(heap_listp, 0);
PUT(heap_listp + (1*WSIZE), PACK(DSIZE, 1));
PUT(heap_listp + (2*WSIZE), PACK(DSIZE, 1));
PUT(heap_listp + (3*WSIZE), PACK(0, 1));
heap_listp += (2 * WSIZE);
free_listp = NULL;
if (extend_heap(CHUNKSIZE / WSIZE) == NULL)
return -1;
return 0;
}
void *mm_malloc(size_t size) {
size_t asize;
size_t extendsize;
char *bp;
if (size == 0)
return NULL;
if (size <= DSIZE)
asize = 2 * DSIZE;
else
asize = DSIZE * ((size + (DSIZE) + (DSIZE - 1)) / DSIZE);
if ((bp = find_fit(asize, next_fit)) != NULL) {
place_for_next_fit(bp, asize);
return bp;
}
extendsize = MAX(asize, CHUNKSIZE);
if ((bp = extend_heap(extendsize / WSIZE)) == NULL)
return NULL;
place_for_next_fit(bp, asize);
return bp;
}
void mm_free(void *bp) {
size_t size = GET_SIZE(HDRP(bp));
PUT(HDRP(bp), PACK(size, 0));
PUT(FTRP(bp), PACK(size, 0));
coalesce_for_next_fit(bp);
}
void *mm_realloc(void *ptr, size_t size) {
void *oldptr = ptr;
void *newptr;
newptr = mm_malloc(size);
if (newptr == NULL)
return NULL;
size_t copysize = GET_SIZE(HDRP(ptr)) - DSIZE;
if (size < copysize) {
copysize = size;
}
memcpy(newptr, oldptr, copysize);
mm_free(oldptr);
return newptr;
}
static void *extend_heap(size_t words) {
char *bp;
size_t size;
size = (words % 2) ? (words + 1) * WSIZE : words * WSIZE;
if ((long) (bp = mem_sbrk(size)) == -1)
return NULL;
PUT(HDRP(bp), PACK(size, 0));
PUT(FTRP(bp), PACK(size, 0));
PUT(HDRP(NEXT_BLKP(bp)), PACK(0, 1));
return coalesce_for_next_fit(bp);
}
static void list_add(void *bp) {
PREDP(bp) = NULL;
SUCCP(bp) = free_listp;
if (free_listp != NULL) {
PREDP(free_listp) = bp;
}
free_listp = bp;
}
static void list_remove(void *bp) {
void *pred_bp = PREDP(bp);
void *succ_bp = SUCCP(bp);
if (pred_bp == NULL && succ_bp == NULL) {
free_listp = NULL;
} else if (pred_bp == NULL) {
PREDP(succ_bp) = NULL;
free_listp = succ_bp;
} else if (succ_bp == NULL) {
SUCCP(pred_bp) = NULL;
} else {
SUCCP(pred_bp) = succ_bp;
PREDP(succ_bp) = pred_bp;
}
}
static void *coalesce_for_next_fit(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));
void *orig_bp = bp;
void *next_bp = NEXT_BLKP(bp);
if (prev_alloc && next_alloc) {
} else if (prev_alloc && !next_alloc) {
list_remove(NEXT_BLKP(bp));
size += GET_SIZE(HDRP(NEXT_BLKP(bp)));
PUT(HDRP(bp), PACK(size, 0));
PUT(FTRP(bp), PACK(size, 0));
} else if (!prev_alloc && next_alloc) {
list_remove(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);
} else {
list_remove(PREV_BLKP(bp));
list_remove(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);
}
if ((next_fit_p != NULL) && (next_fit_p == orig_bp || next_fit_p == next_bp)) {
next_fit_p = bp;
}
list_add(bp);
return bp;
}
static void *next_fit(size_t asize) {
void *bp;
char *start_p;
if (next_fit_p == NULL) {
next_fit_p = free_listp;
}
start_p = next_fit_p;
for (bp = start_p; bp != NULL; bp = SUCCP(bp)) {
if (asize <= GET_SIZE(HDRP(bp))) {
return bp;
}
}
for (bp = free_listp; bp != start_p; bp = SUCCP(bp)) {
if (asize <= GET_SIZE(HDRP(bp))) {
return bp;
}
}
return NULL;
}
static void *find_fit(size_t asize, fit_policy_t fit_policy) {
return fit_policy(asize);
}
static void place_for_next_fit(void *bp, size_t asize) {
size_t csize = GET_SIZE(HDRP(bp));
void *succ_bp = SUCCP(bp);
list_remove(bp);
if ((csize - asize) >= (2 * DSIZE)) {
PUT(HDRP(bp), PACK(asize, 1));
PUT(FTRP(bp), PACK(asize, 1));
void *next_bp = NEXT_BLKP(bp);
PUT(HDRP(next_bp), PACK(csize-asize, 0));
PUT(FTRP(next_bp), PACK(csize-asize, 0));
list_add(next_bp);
next_fit_p = next_bp;
} else {
PUT(HDRP(bp), PACK(csize, 1));
PUT(FTRP(bp), PACK(csize, 1));
next_fit_p = (succ_bp != NULL) ? succ_bp : free_listp;
}
}