Modified helper functions
This commit is contained in:
115
mm.c
115
mm.c
@@ -133,18 +133,18 @@ static void add_free(void* bp, size_t asize);
|
|||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
static void *extend_heap(size_t size)
|
static void *extend_heap(size_t size)
|
||||||
{
|
{
|
||||||
void *ptr;
|
size_t asize;
|
||||||
size_t asize; // Adjusted size
|
|
||||||
|
|
||||||
asize = ALIGN(size);
|
asize = ALIGN(size);
|
||||||
|
void *ptr;
|
||||||
|
|
||||||
if ((ptr = mem_sbrk(asize)) == (void *)-1)
|
if ((ptr = mem_sbrk(asize)) == (void *)-1)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// Set headers and footer
|
/* Set Header and Footer*/
|
||||||
PUTT(HDRP(ptr), PACK(asize, 0));
|
PUTT(HDRP(ptr), PACK(asize, 0));
|
||||||
PUTT(FTRP(ptr), PACK(asize, 0));
|
PUTT(FTRP(ptr), PACK(asize, 0));
|
||||||
PUTT(HDRP(NEXT_BLKP(ptr)), PACK(0, 1));
|
PUTT(HDRP(NEXT_BLKP(ptr)), PACK(0, 1));
|
||||||
|
|
||||||
add_free(ptr, asize);
|
add_free(ptr, asize);
|
||||||
|
|
||||||
return coalesce(ptr);
|
return coalesce(ptr);
|
||||||
@@ -152,77 +152,72 @@ static void *extend_heap(size_t size)
|
|||||||
|
|
||||||
static void add_free(void *ptr, size_t size) {
|
static void add_free(void *ptr, size_t size) {
|
||||||
int list = 0;
|
int list = 0;
|
||||||
void *search_ptr = ptr;
|
void *searching_ptr = ptr;
|
||||||
void *insert_ptr = NULL;
|
void *in_ptr = NULL;
|
||||||
|
|
||||||
// Select segregated list
|
/* Select List*/
|
||||||
while ((list < LISTSIZE - 1) && (size > 1)) {
|
while ((list < LISTSIZE - 1) && (size > 1)) {
|
||||||
size >>= 1;
|
size >>= 1;
|
||||||
list++;
|
list++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keep size ascending order and search
|
/* Search in size-ascending order*/
|
||||||
search_ptr = seg_list[list];
|
searching_ptr = seg_list[list];
|
||||||
while ((search_ptr != NULL) && (size > GET_SIZE(HDRP(search_ptr)))) {
|
while ((searching_ptr != NULL) && (size > GET_SIZE(HDRP(searching_ptr)))) {
|
||||||
insert_ptr = search_ptr;
|
in_ptr = searching_ptr;
|
||||||
search_ptr = PRV_BLK(search_ptr);
|
searching_ptr = PRV_BLK(searching_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set predecessor and successor
|
/* Set previous and next*/
|
||||||
if (search_ptr != NULL) {
|
if (searching_ptr != NULL && in_ptr != NULL) {
|
||||||
if (insert_ptr != NULL) {
|
PUT_PTR(NXT_PTR(searching_ptr), ptr);
|
||||||
PUT_PTR(PRV_PTR(ptr), search_ptr);
|
PUT_PTR(NXT_PTR(ptr), in_ptr);
|
||||||
PUT_PTR(NXT_PTR(search_ptr), ptr);
|
PUT_PTR(PRV_PTR(ptr), searching_ptr);
|
||||||
PUT_PTR(NXT_PTR(ptr), insert_ptr);
|
PUT_PTR(PRV_PTR(in_ptr), ptr);
|
||||||
PUT_PTR(PRV_PTR(insert_ptr), ptr);
|
}
|
||||||
} else {
|
else if (searching_ptr != NULL && in_ptr == NULL) {
|
||||||
PUT_PTR(PRV_PTR(ptr), search_ptr);
|
PUT_PTR(PRV_PTR(ptr), searching_ptr);
|
||||||
PUT_PTR(NXT_PTR(search_ptr), ptr);
|
PUT_PTR(NXT_PTR(searching_ptr), ptr);
|
||||||
PUT_PTR(NXT_PTR(ptr), NULL);
|
PUT_PTR(NXT_PTR(ptr), NULL);
|
||||||
seg_list[list] = ptr;
|
seg_list[list] = ptr;
|
||||||
}
|
}
|
||||||
} else {
|
else if(searching_ptr == NULL && in_ptr != NULL) {
|
||||||
if (insert_ptr != NULL) {
|
PUT_PTR(NXT_PTR(ptr), in_ptr);
|
||||||
PUT_PTR(PRV_PTR(ptr), NULL);
|
PUT_PTR(PRV_PTR(ptr), NULL);
|
||||||
PUT_PTR(NXT_PTR(ptr), insert_ptr);
|
PUT_PTR(PRV_PTR(in_ptr), ptr);
|
||||||
PUT_PTR(PRV_PTR(insert_ptr), ptr);
|
}
|
||||||
} else {
|
else {
|
||||||
PUT_PTR(PRV_PTR(ptr), NULL);
|
PUT_PTR(NXT_PTR(ptr), NULL);
|
||||||
PUT_PTR(NXT_PTR(ptr), NULL);
|
PUT_PTR(PRV_PTR(ptr), NULL);
|
||||||
seg_list[list] = ptr;
|
seg_list[list] = ptr;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void delete_node(void *ptr) {
|
static void remove_free(void *ptr) {
|
||||||
int list = 0;
|
int list = 0;
|
||||||
size_t size = GET_SIZE(HDRP(ptr));
|
size_t size = GET_SIZE(HDRP(ptr));
|
||||||
|
|
||||||
// Select segregated list
|
/* Select List*/
|
||||||
while ((list < LISTSIZE - 1) && (size > 1)) {
|
while ((list < LISTSIZE - 1) && (size > 1)) {
|
||||||
size >>= 1;
|
size >>= 1;
|
||||||
list++;
|
list++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PRV_BLK(ptr) != NULL) {
|
if (PRV_BLK(ptr) != NULL && NXT_BLK(ptr) != NULL) {
|
||||||
if (NXT_BLK(ptr) != NULL) {
|
PUT_PTR(NXT_PTR(PRV_BLK(ptr)), NXT_BLK(ptr));
|
||||||
PUT_PTR(NXT_PTR(PRV_BLK(ptr)), NXT_BLK(ptr));
|
PUT_PTR(PRV_PTR(NXT_BLK(ptr)), PRV_BLK(ptr));
|
||||||
PUT_PTR(PRV_PTR(NXT_BLK(ptr)), PRV_BLK(ptr));
|
} else if(PRV_BLK(ptr) != NULL && NXT_BLK(ptr) == NULL) {
|
||||||
} else {
|
PUT_PTR(NXT_PTR(PRV_BLK(ptr)), NULL);
|
||||||
PUT_PTR(NXT_PTR(PRV_BLK(ptr)), NULL);
|
seg_list[list] = PRV_BLK(ptr);
|
||||||
seg_list[list] = PRV_BLK(ptr);
|
}
|
||||||
}
|
else if(PRV_BLK(ptr) == NULL && NXT_BLK(ptr) != NULL) {
|
||||||
|
PUT_PTR(PRV_PTR(NXT_BLK(ptr)), NULL);
|
||||||
} else {
|
} else {
|
||||||
if (NXT_BLK(ptr) != NULL) {
|
seg_list[list] = NULL;
|
||||||
PUT_PTR(PRV_PTR(NXT_BLK(ptr)), NULL);
|
}
|
||||||
} else {
|
|
||||||
seg_list[list] = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -238,22 +233,22 @@ static void *coalesce(void *ptr)
|
|||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
else if (prev_alloc && !next_alloc) { // Case 2
|
else if (prev_alloc && !next_alloc) { // Case 2
|
||||||
delete_node(ptr);
|
remove_free(ptr);
|
||||||
delete_node(NEXT_BLKP(ptr));
|
remove_free(NEXT_BLKP(ptr));
|
||||||
size += GET_SIZE(HDRP(NEXT_BLKP(ptr)));
|
size += GET_SIZE(HDRP(NEXT_BLKP(ptr)));
|
||||||
PUT(HDRP(ptr), PACK(size, 0));
|
PUT(HDRP(ptr), PACK(size, 0));
|
||||||
PUT(FTRP(ptr), PACK(size, 0));
|
PUT(FTRP(ptr), PACK(size, 0));
|
||||||
} else if (!prev_alloc && next_alloc) { // Case 3
|
} else if (!prev_alloc && next_alloc) { // Case 3
|
||||||
delete_node(ptr);
|
remove_free(ptr);
|
||||||
delete_node(PREV_BLKP(ptr));
|
remove_free(PREV_BLKP(ptr));
|
||||||
size += GET_SIZE(HDRP(PREV_BLKP(ptr)));
|
size += GET_SIZE(HDRP(PREV_BLKP(ptr)));
|
||||||
PUT(FTRP(ptr), PACK(size, 0));
|
PUT(FTRP(ptr), PACK(size, 0));
|
||||||
PUT(HDRP(PREV_BLKP(ptr)), PACK(size, 0));
|
PUT(HDRP(PREV_BLKP(ptr)), PACK(size, 0));
|
||||||
ptr = PREV_BLKP(ptr);
|
ptr = PREV_BLKP(ptr);
|
||||||
} else { // Case 4
|
} else { // Case 4
|
||||||
delete_node(ptr);
|
remove_free(ptr);
|
||||||
delete_node(PREV_BLKP(ptr));
|
remove_free(PREV_BLKP(ptr));
|
||||||
delete_node(NEXT_BLKP(ptr));
|
remove_free(NEXT_BLKP(ptr));
|
||||||
size += GET_SIZE(HDRP(PREV_BLKP(ptr))) + GET_SIZE(HDRP(NEXT_BLKP(ptr)));
|
size += GET_SIZE(HDRP(PREV_BLKP(ptr))) + GET_SIZE(HDRP(NEXT_BLKP(ptr)));
|
||||||
PUT(HDRP(PREV_BLKP(ptr)), PACK(size, 0));
|
PUT(HDRP(PREV_BLKP(ptr)), PACK(size, 0));
|
||||||
PUT(FTRP(NEXT_BLKP(ptr)), PACK(size, 0));
|
PUT(FTRP(NEXT_BLKP(ptr)), PACK(size, 0));
|
||||||
@@ -270,7 +265,7 @@ static void *place(void *ptr, size_t asize)
|
|||||||
size_t ptr_size = GET_SIZE(HDRP(ptr));
|
size_t ptr_size = GET_SIZE(HDRP(ptr));
|
||||||
size_t remainder = ptr_size - asize;
|
size_t remainder = ptr_size - asize;
|
||||||
|
|
||||||
delete_node(ptr);
|
remove_free(ptr);
|
||||||
|
|
||||||
|
|
||||||
if (remainder <= DSIZE * 2) {
|
if (remainder <= DSIZE * 2) {
|
||||||
|
|||||||
Reference in New Issue
Block a user