Skip to content
Snippets Groups Projects
Commit 6a6b4bc4 authored by DocQuantum's avatar DocQuantum
Browse files

Implemented boundary tags, converted system to use them in all functions

parent 63fde384
Branches
Tags
No related merge requests found
...@@ -52,7 +52,7 @@ team_t team = { ...@@ -52,7 +52,7 @@ team_t team = {
#define WSIZE 4 /* word size (bytes) */ #define WSIZE 4 /* word size (bytes) */
#define DSIZE 8 /* doubleword size (bytes) */ #define DSIZE 8 /* doubleword size (bytes) */
#define CHUNKSIZE (1<<12) /* initial heap size (bytes) */ #define CHUNKSIZE (1<<12) /* initial heap size (bytes) */
#define OVERHEAD 4 /* overhead of header (bytes) */ #define OVERHEAD 8 /* overhead of headers (bytes) */
#define MAX(x, y) ((x) > (y)? (x) : (y)) #define MAX(x, y) ((x) > (y)? (x) : (y))
...@@ -67,24 +67,36 @@ team_t team = { ...@@ -67,24 +67,36 @@ team_t team = {
#define GET_SIZE(p) (GET(p) & ~0x7) #define GET_SIZE(p) (GET(p) & ~0x7)
#define GET_ALLOC(p) (GET(p) & 0x1) #define GET_ALLOC(p) (GET(p) & 0x1)
/* Given block ptr bp, compute address of its header*/ /* Given block ptr bp, compute address of its header and footer*/
#define HDRP(bp) ((char *)(bp) - WSIZE) #define HDRP(bp) ((char *)(bp) - WSIZE)
#define FTRP(bp) ((char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE)
/* Given block ptr bp, compute address of next block */ /* Given block ptr bp, compute address of next and prev blocks */
#define NEXT_BLKP(bp) ((char *)(bp) + GET_SIZE(((char*)(bp) - WSIZE))) #define NEXT_BLKP(bp) ((char *)(bp) + GET_SIZE((char *)(bp) - WSIZE))
#define PREV_BLKP(bp) ((char *)(bp) - GET_SIZE((char *)(bp) - DSIZE))
/* $end mallocmacros */ /* $end mallocmacros */
/* Global variables */ /* Global variables */
static char *heap_listp; /* pointer to first block */ static char *heap_listp; /* pointer to first block */
// static char *free_listp; /* pointer to free list */
// typedef struct Node
// {
// char * prev;
// char * next;
// }Node;
/* function prototypes for internal helper routines */ /* function prototypes for internal helper routines */
static void *extend_heap(size_t words); static void *extend_heap(size_t words);
static void place(void *bp, size_t asize); static void place(void *bp, size_t asize);
static void *find_fit(size_t asize); static void *find_fit(size_t asize);
static void printblock(void *bp); static void printblock(void *bp);
static void mm_coalesce(void *bp); static int mm_coalesce(void *bp);
static void mm_memcpy(void * dest, void * src); static void mm_memcpy(void * dest, void * src);
/* /*
...@@ -161,22 +173,26 @@ void *mm_malloc(size_t size) ...@@ -161,22 +173,26 @@ void *mm_malloc(size_t size)
/* /*
* mm_free - Free a block * mm_free - Free a block
* *
* Given the alloced bit is set, get header and increment by 1 * Given the alloced bit is set, tries to coalesce which
* since that essentially sets the bit to 1 or free, else print * frees be default, else OR's header and footer with 1,
* error to stderr. * else print error to stderr.
*/ */
/* $begin mmfree */ /* $begin mmfree */
void mm_free(void *bp) void mm_free(void *bp)
{ {
if(bp == NULL){ if(bp == NULL){
fprintf(stderr, "Error: memory not alloced or corrupted"); fprintf(stderr, "Error: memory not alloced or corrupted");
return;
} }
if(!GET_ALLOC(HDRP(bp))){ if(!GET_ALLOC(HDRP(bp))){
if(mm_coalesce(bp)){
*HDRP(bp) |= 1; *HDRP(bp) |= 1;
mm_coalesce(bp); *FTRP(bp) |= 1;
}
} else { } else {
fprintf(stderr, "Error: memory not alloced or corrupted"); fprintf(stderr, "Error: memory not alloced or corrupted");
return;
} }
mm_checkheap(0); mm_checkheap(0);
...@@ -190,34 +206,32 @@ void mm_free(void *bp) ...@@ -190,34 +206,32 @@ void mm_free(void *bp)
* Given a block pointer that has been freed, find empty * Given a block pointer that has been freed, find empty
* blocks near it to be combined into a large free chunk. * blocks near it to be combined into a large free chunk.
* *
* Returns 0 on success, 1 on failure
*
*/ */
static void mm_coalesce(void *bp) static int mm_coalesce(void *bp)
{ {
//find previous block
char * prev;
for (prev = heap_listp; GET_SIZE(prev-WSIZE) > 0; prev = NEXT_BLKP(prev)) {
if (NEXT_BLKP(prev) == bp) {
break;
}
}
size_t nextBlock = GET_ALLOC(HDRP(NEXT_BLKP(bp))); size_t nextBlock = GET_ALLOC(HDRP(NEXT_BLKP(bp)));
size_t prevBlock = GET_ALLOC(HDRP(prev)); size_t prevBlock = GET_ALLOC(HDRP(PREV_BLKP(bp)));
size_t size = GET_SIZE(HDRP(bp)); size_t size = GET_SIZE(HDRP(bp));
if(prevBlock && nextBlock){ if(prevBlock && nextBlock){
size += GET_SIZE(HDRP(prev)) + GET_SIZE(HDRP(NEXT_BLKP(bp))); size += GET_SIZE(HDRP(PREV_BLKP(bp))) + GET_SIZE(HDRP(NEXT_BLKP(bp)));
PUT(HDRP(prev), PACK(size, 1)); PUT(HDRP(PREV_BLKP(bp)), PACK(size, 1));
return; PUT(FTRP(PREV_BLKP(bp)), PACK(size, 1));
return 0;
} else if(prevBlock && !nextBlock){ } else if(prevBlock && !nextBlock){
size += GET_SIZE(HDRP(prev)); size += GET_SIZE(HDRP(PREV_BLKP(bp)));
PUT(HDRP(prev), PACK(size, 1)); PUT(HDRP(PREV_BLKP(bp)), PACK(size, 1));
return; PUT(FTRP(PREV_BLKP(bp)), PACK(size, 1));
return 0;
} else if(!prevBlock && nextBlock){ } else if(!prevBlock && nextBlock){
size += GET_SIZE(HDRP(NEXT_BLKP(bp))); size += GET_SIZE(HDRP(NEXT_BLKP(bp)));
PUT(HDRP(bp), PACK(size, 1)); PUT(HDRP(bp), PACK(size, 1));
return; PUT(FTRP(bp), PACK(size, 1));
return 0;
} }
return 1;
} }
/* /*
...@@ -274,11 +288,14 @@ void *mm_realloc(void *ptr, size_t size) ...@@ -274,11 +288,14 @@ void *mm_realloc(void *ptr, size_t size)
if(size < oldSize) { if(size < oldSize) {
if ((oldSize - size) >= DSIZE) { if ((oldSize - size) >= DSIZE) {
PUT(HDRP(ptr), PACK(size, 0)); PUT(HDRP(ptr), PACK(size, 0));
PUT(FTRP(ptr), PACK(size, 0));
PUT(HDRP(NEXT_BLKP(ptr)), PACK(oldSize-size, 1)); PUT(HDRP(NEXT_BLKP(ptr)), PACK(oldSize-size, 1));
PUT(FTRP(NEXT_BLKP(ptr)), PACK(oldSize-size, 1));
mm_coalesce(NEXT_BLKP(ptr)); mm_coalesce(NEXT_BLKP(ptr));
} }
else { else {
PUT(HDRP(ptr), PACK(oldSize, 0)); PUT(HDRP(ptr), PACK(oldSize, 0));
PUT(FTRP(ptr), PACK(oldSize, 0));
} }
return ptr; return ptr;
} }
...@@ -289,11 +306,14 @@ void *mm_realloc(void *ptr, size_t size) ...@@ -289,11 +306,14 @@ void *mm_realloc(void *ptr, size_t size)
if(GET_ALLOC(HDRP(NEXT_BLKP(ptr))) && nextSize >= size){ if(GET_ALLOC(HDRP(NEXT_BLKP(ptr))) && nextSize >= size){
if ((nextSize - size) >= DSIZE) { if ((nextSize - size) >= DSIZE) {
PUT(HDRP(ptr), PACK(size, 0)); PUT(HDRP(ptr), PACK(size, 0));
PUT(FTRP(ptr), PACK(size, 0));
PUT(HDRP(NEXT_BLKP(ptr)), PACK(nextSize-size, 1)); PUT(HDRP(NEXT_BLKP(ptr)), PACK(nextSize-size, 1));
PUT(FTRP(NEXT_BLKP(ptr)), PACK(nextSize-size, 1));
mm_coalesce(NEXT_BLKP(ptr)); mm_coalesce(NEXT_BLKP(ptr));
} }
else { else {
PUT(HDRP(ptr), PACK(nextSize, 0)); PUT(HDRP(ptr), PACK(nextSize, 0));
PUT(FTRP(ptr), PACK(nextSize, 0));
} }
return ptr; return ptr;
...@@ -390,11 +410,14 @@ static void place(void *bp, size_t asize) ...@@ -390,11 +410,14 @@ static void place(void *bp, size_t asize)
if ((csize - asize) >= (DSIZE)) { if ((csize - asize) >= (DSIZE)) {
PUT(HDRP(bp), PACK(asize, 0)); PUT(HDRP(bp), PACK(asize, 0));
PUT(FTRP(bp), PACK(asize, 0));
bp = NEXT_BLKP(bp); bp = NEXT_BLKP(bp);
PUT(HDRP(bp), PACK(csize-asize, 1)); PUT(HDRP(bp), PACK(csize-asize, 1));
PUT(FTRP(bp), PACK(csize-asize, 1));
} }
else { else {
PUT(HDRP(bp), PACK(csize, 0)); PUT(HDRP(bp), PACK(csize, 0));
PUT(FTRP(bp), PACK(csize, 0));
} }
} }
/* $end mmplace */ /* $end mmplace */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment