Added new function add_free()
parent
27e75d248b
commit
f8f1f2c067
27
mm.c
27
mm.c
|
@ -104,8 +104,11 @@ team_t team = {
|
|||
|
||||
#define PUT_PTR(p, ptr) (*(unsigned int *)(p) = (unsigned int)(ptr))
|
||||
|
||||
#define PRV_FREE(bp) ((char *)(bp))
|
||||
#define NXT_FREE(bp) ((char *)(bp) + WSIZE)
|
||||
#define PRV_PTR(ptr) ((char *)(ptr))
|
||||
#define NXT_PTR(bp) ((char *)(bp) + WSIZE)
|
||||
|
||||
#define PRV_BLK(bp) (*(char **)(bp))
|
||||
#define NXT_BLK(bp) (*(char **)(NXT_PTR(bp)))
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////// STATIC VARS /////////////////////////////////
|
||||
|
@ -134,6 +137,14 @@ static void add_free(void* ptr, size_t size)
|
|||
{
|
||||
int szClass = getSzClass(size);
|
||||
void* classPtr = seg_list[szClass];
|
||||
|
||||
while(classPtr != NULL)
|
||||
{
|
||||
classPtr = NXT_PTR(classPtr);
|
||||
}
|
||||
PUT_PTR(NXT_PTR(classPTR), ptr)
|
||||
PUT_PTR(PRV_PTR(ptr), classPtr)
|
||||
PUT_PTR(NXT_PTR(ptr), NULL);
|
||||
}
|
||||
|
||||
static void place(void *bp, size_t asize)
|
||||
|
@ -165,13 +176,13 @@ static void* best_fit(void* ptr, size_t asize) {
|
|||
unsigned long left_over = GET_SIZE(ptr) - asize;
|
||||
void* bestfit = ptr;
|
||||
int best_left_over = GET_SIZE(ptr) - asize);
|
||||
while (NXT_FREE(ptr) != NULL) {
|
||||
while (NXT_PTR(ptr) != NULL) {
|
||||
left_over = GET_SIZE(ptr) - asize);
|
||||
if(left_over<best_left_over){
|
||||
best_left_over = left_over;
|
||||
bestfit=ptr;
|
||||
}
|
||||
ptr = NXT_FREE(ptr);
|
||||
ptr = NXT_PTR(ptr);
|
||||
}
|
||||
return bestfit;
|
||||
}
|
||||
|
@ -184,8 +195,8 @@ static void* find_fit(size_t asize)
|
|||
return NULL;
|
||||
} else {
|
||||
if (szClass != LISTSIZE -1) {
|
||||
while (NXT_FREE(classPtr) != NULL) {
|
||||
classPtr = NXT_FREE(classPtr);
|
||||
while (NXT_PTR(classPtr) != NULL) {
|
||||
classPtr = NXT_PTR(classPtr);
|
||||
}
|
||||
return classPtr;
|
||||
} else {
|
||||
|
@ -241,8 +252,8 @@ static void *extend_heap(size_t words)
|
|||
PUT(FTRP(bp), PACK(size,0)); /* Free block footer */
|
||||
PUT(HDRP(NEXT_BLKP(bp)), PACK(0, 1)); /* New epilogue header */
|
||||
|
||||
PUT_PTR(PRV_FREE(bp), 0);
|
||||
PUT_PTR(NXT_FREE(bp), 0);
|
||||
PUT_PTR(PRV_PTR(bp), 0);
|
||||
PUT_PTR(NXT_PTR(bp), 0);
|
||||
|
||||
/* Coalesce if the previous block was free */
|
||||
return coalesce(bp);
|
||||
|
|
Loading…
Reference in New Issue