diff --git a/Makefile b/Makefile index f9f8bed..d4ab256 100644 --- a/Makefile +++ b/Makefile @@ -2,8 +2,8 @@ # Students' Makefile for the Malloc Lab # CC = gcc -CFLAGS = -Wall -O2 -m32 -# CFLAGS = -Wall -O0 -m32 -g03 -pg +# CFLAGS = -Wall -O2 -m32 +CFLAGS = -Wall -O0 -m32 -g03 -pg OBJS = mdriver.o mm.o memlib.o fsecs.o fcyc.o clock.o ftimer.o diff --git a/mm.c b/mm.c index e53e8c0..43711e8 100644 --- a/mm.c +++ b/mm.c @@ -125,10 +125,20 @@ static void add_free(void *ptr, size_t size); static void remove_free(void *ptr); static void *coalesce(void *ptr); static void *place(void *ptr, size_t asize); +static int getSzClass(size_t asize); //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// HELPER FUNCTIONS /////////////////////////////// //////////////////////////////////////////////////////////////////////////////// +static int getSzClass(size_t asize) { + for (size_t i = 0; i < LISTSIZE; ++i) { + if (asize == (1 << i)) { + return i; + } + } + return LISTSIZE-1; +} + static void *extend_heap(size_t size) { size_t asize; @@ -149,42 +159,36 @@ static void *extend_heap(size_t size) } static void add_free(void *ptr, size_t size) { - int list = 0; - void *searching_ptr = ptr; - void *in_ptr = NULL; - - while ((list < LISTSIZE - 1) && (size > 1)) { - size >>= 1; - list++; + int szClass = getSzClass(size); + void* class_ptr = seg_list[szClass]; + void *pre_ptr = NULL; + + while ((class_ptr != NULL) && (size > GET_SIZE(HDRP(class_ptr)))) { + pre_ptr = class_ptr; + class_ptr = PRV_BLK(class_ptr); } - searching_ptr = seg_list[list]; - while ((searching_ptr != NULL) && (size > GET_SIZE(HDRP(searching_ptr)))) { - in_ptr = searching_ptr; - searching_ptr = PRV_BLK(searching_ptr); - } - - if (searching_ptr != NULL && in_ptr != NULL) { - PUT_PTR(NXT_PTR(searching_ptr), ptr); - PUT_PTR(NXT_PTR(ptr), in_ptr); - PUT_PTR(PRV_PTR(ptr), searching_ptr); - PUT_PTR(PRV_PTR(in_ptr), ptr); + if (class_ptr != NULL && pre_ptr != NULL) { + PUT_PTR(NXT_PTR(class_ptr), ptr); + PUT_PTR(NXT_PTR(ptr), pre_ptr); + PUT_PTR(PRV_PTR(ptr), class_ptr); + PUT_PTR(PRV_PTR(pre_ptr), ptr); } - else if (searching_ptr != NULL && in_ptr == NULL) { - PUT_PTR(PRV_PTR(ptr), searching_ptr); - PUT_PTR(NXT_PTR(searching_ptr), ptr); + else if (class_ptr != NULL && pre_ptr == NULL) { + PUT_PTR(PRV_PTR(ptr), class_ptr); + PUT_PTR(NXT_PTR(class_ptr), ptr); PUT_PTR(NXT_PTR(ptr), NULL); - seg_list[list] = ptr; + seg_list[szClass] = ptr; } - else if(searching_ptr == NULL && in_ptr != NULL) { - PUT_PTR(NXT_PTR(ptr), in_ptr); + else if(class_ptr == NULL && pre_ptr != NULL) { + PUT_PTR(NXT_PTR(ptr), pre_ptr); PUT_PTR(PRV_PTR(ptr), NULL); - PUT_PTR(PRV_PTR(in_ptr), ptr); + PUT_PTR(PRV_PTR(pre_ptr), ptr); } else { PUT_PTR(NXT_PTR(ptr), NULL); PUT_PTR(PRV_PTR(ptr), NULL); - seg_list[list] = ptr; + seg_list[szClass] = ptr; } return; @@ -192,25 +196,20 @@ static void add_free(void *ptr, size_t size) { static void remove_free(void *ptr) { - int list = 0; size_t size = GET_SIZE(HDRP(ptr)); - - while ((list < LISTSIZE - 1) && (size > 1)) { - size >>= 1; - list++; - } + int szClass = getSzClass(size); if (PRV_BLK(ptr) != NULL && NXT_BLK(ptr) != NULL) { PUT_PTR(NXT_PTR(PRV_BLK(ptr)), NXT_BLK(ptr)); PUT_PTR(PRV_PTR(NXT_BLK(ptr)), PRV_BLK(ptr)); } else if(PRV_BLK(ptr) != NULL && NXT_BLK(ptr) == NULL) { PUT_PTR(NXT_PTR(PRV_BLK(ptr)), NULL); - seg_list[list] = PRV_BLK(ptr); + seg_list[szClass] = PRV_BLK(ptr); } else if(PRV_BLK(ptr) == NULL && NXT_BLK(ptr) != NULL) { PUT_PTR(PRV_PTR(NXT_BLK(ptr)), NULL); } else { - seg_list[list] = NULL; + seg_list[szClass] = NULL; } return; }