Skip to content

Commit 6327740

Browse files
committed
insert in address order
1 parent 36d1469 commit 6327740

File tree

1 file changed

+28
-7
lines changed
  • malloclab-handout

1 file changed

+28
-7
lines changed

malloclab-handout/mm.c

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ inline static void *get_class_ptr(size_t size)
145145
/*
146146
* append free block to the tail of free list
147147
*/
148+
#if 0
148149
inline static void append_free_block(void *bp)
149150
{
150151
// usable block size should exlude the header/footer size
@@ -158,6 +159,8 @@ inline static void append_free_block(void *bp)
158159
PUT(SUCC(tail_bp), GET_OFFSET(bp));
159160
PUT(PRED(class_ptr), GET_OFFSET(bp));
160161
}
162+
#endif
163+
161164

162165
/*
163166
* insert free block bp after prev_bp
@@ -171,6 +174,19 @@ inline static void insert_free_block(void *prev_bp, void *bp)
171174
PUT(PRED(succ_bp), GET_OFFSET(bp));
172175
}
173176

177+
inline static void insert_free_block_address_order(void *bp)
178+
{
179+
size_t size = GET_SIZE(HDRP(bp));
180+
void *class_ptr = get_class_ptr(size);
181+
void *cur_bp;
182+
for_each_free_block(class_ptr, cur_bp) {
183+
if (cur_bp > bp) {
184+
break;
185+
}
186+
}
187+
insert_free_block(PRED_BLKP(cur_bp), bp);
188+
}
189+
174190
/*
175191
* remove free block from free list
176192
* assert bp is not a class_ptr
@@ -280,7 +296,7 @@ static void *coalesce(void *bp)
280296
PUT(FTRP(NEXT_BLKP(bp)), PACK(size, 0));
281297
bp = PREV_BLKP(bp);
282298
}
283-
append_free_block(bp);
299+
insert_free_block_address_order(bp);
284300
return bp;
285301
}
286302

@@ -335,7 +351,7 @@ static void place(void *bp, size_t size)
335351
PACK(size, 1), // allocated block
336352
PACK(total_size - size, 0) // free block
337353
);
338-
append_free_block(free_bp);
354+
insert_free_block_address_order(free_bp);
339355
} else {
340356
PUT(HDRP(bp), PACK(total_size, 1));
341357
PUT(FTRP(bp), PACK(total_size, 1));
@@ -390,7 +406,6 @@ void free (void *ptr)
390406
PUT(HDRP(ptr), PACK(size, 0));
391407
PUT(FTRP(ptr), PACK(size, 0));
392408
coalesce(ptr);
393-
// append_free_block(ptr);
394409
}
395410

396411
/*
@@ -433,7 +448,6 @@ void *realloc1(void *oldptr, size_t size)
433448
PACK(size, 1),
434449
PACK(oldsize-size, 0));
435450
free_block = coalesce(free_block);
436-
// append_free_block(free_block);
437451
} else {
438452
return oldptr;
439453
}
@@ -452,7 +466,7 @@ void *realloc1(void *oldptr, size_t size)
452466
split_block(next_block,
453467
PACK(first_block_size, 1),
454468
PACK(second_block_size, 0));
455-
append_free_block(free_block);
469+
insert_free_block_address_order(free_block);
456470
// change the size of the new block
457471
PUT(HDRP(oldptr), PACK(size, 1));
458472
PUT(FTRP(oldptr), PACK(size, 1));
@@ -576,11 +590,15 @@ static int aligned(const void *p) {
576590
}
577591

578592
#define CHECK_GREATER_EQUAL(v, cmp_v, lineno, msg) if (!((v) >= (cmp_v))) {\
579-
err_report(lineno, msg); \
593+
err_report(lineno, msg); \
580594
}
581595

582596
#define CHECK_LESS_EQUAL(v, cmp_v, lineno, msg) if (!((v) <= (cmp_v))) {\
583-
err_report(lineno, msg); \
597+
err_report(lineno, msg); \
598+
}
599+
600+
#define CHECK_LESS(v, cmp_v, lineno, msg) if (!((v) < cmp_v)) {\
601+
err_report(lineno, msg); \
584602
}
585603

586604

@@ -708,6 +726,9 @@ void mm_checkheap(int lineno)
708726
CHECK_GREATER_EQUAL(GET_SIZE(HDRP(bp)), min_class_size, lineno,
709727
"free block size in class range(min size)");
710728

729+
// if blocks are inserted in address order, check address order
730+
CHECK_LESS(PRED_BLKP(bp), bp, lineno,
731+
"address order for each free list");
711732
}
712733
}
713734

0 commit comments

Comments
 (0)