Skip to content

Commit 542b748

Browse files
author
Wei Li
committed
multiple insert method
1 parent 6327740 commit 542b748

File tree

1 file changed

+47
-19
lines changed
  • malloclab-handout

1 file changed

+47
-19
lines changed

malloclab-handout/mm.c

Lines changed: 47 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,18 @@
2424
#endif
2525

2626

27+
#define ADDRESS_ORDER
28+
#ifdef LIFO
29+
#define insert_free_block insert_free_block_lifo
30+
#elif defined(FIFO)
31+
#define insert_free_block insert_free_block_fifo
32+
#elif defined(ADDRESS_ORDER)
33+
#define insert_free_block insert_free_block_address_order
34+
#else
35+
#define insert_free_block insert_free_block_lifo
36+
#endif
37+
38+
2739
/* do not change the following! */
2840
#ifdef DRIVER
2941
/* create aliases for driver tests */
@@ -142,38 +154,44 @@ inline static void *get_class_ptr(size_t size)
142154
return FREE_LIST_REF(offset);
143155
}
144156

157+
145158
/*
146-
* append free block to the tail of free list
159+
* insert free block bp after prev_bp
147160
*/
148-
#if 0
149-
inline static void append_free_block(void *bp)
161+
inline static void insert_free_block_after(void *prev_bp, void *bp)
162+
{
163+
void *succ_bp = SUCC_BLKP(prev_bp);
164+
PUT(SUCC(bp), GET(SUCC(prev_bp)));
165+
PUT(PRED(bp), GET_OFFSET(prev_bp));
166+
PUT(SUCC(prev_bp), GET_OFFSET(bp));
167+
PUT(PRED(succ_bp), GET_OFFSET(bp));
168+
}
169+
170+
/*
171+
* first in first out
172+
*/
173+
inline static void insert_free_block_fifo(void *bp)
150174
{
151175
// usable block size should exlude the header/footer size
152176
size_t size = GET_SIZE(HDRP(bp));
153177
void *class_ptr = get_class_ptr(size);
154178
void *tail_bp = PRED_BLKP(class_ptr);
155179

156-
// insert_free_block(tail_bp, bp);
180+
insert_free_block_after(tail_bp, bp);
181+
/*
157182
PUT(SUCC(bp), GET(SUCC(tail_bp)));
158183
PUT(PRED(bp), GET_OFFSET(tail_bp));
159184
PUT(SUCC(tail_bp), GET_OFFSET(bp));
160185
PUT(PRED(class_ptr), GET_OFFSET(bp));
186+
*/
161187
}
162-
#endif
188+
189+
163190

164191

165192
/*
166-
* insert free block bp after prev_bp
193+
* insert free block in address order
167194
*/
168-
inline static void insert_free_block(void *prev_bp, void *bp)
169-
{
170-
void *succ_bp = SUCC_BLKP(prev_bp);
171-
PUT(SUCC(bp), GET(SUCC(prev_bp)));
172-
PUT(PRED(bp), GET_OFFSET(prev_bp));
173-
PUT(SUCC(prev_bp), GET_OFFSET(bp));
174-
PUT(PRED(succ_bp), GET_OFFSET(bp));
175-
}
176-
177195
inline static void insert_free_block_address_order(void *bp)
178196
{
179197
size_t size = GET_SIZE(HDRP(bp));
@@ -184,7 +202,17 @@ inline static void insert_free_block_address_order(void *bp)
184202
break;
185203
}
186204
}
187-
insert_free_block(PRED_BLKP(cur_bp), bp);
205+
insert_free_block_after(PRED_BLKP(cur_bp), bp);
206+
}
207+
208+
/*
209+
* last in first out
210+
*/
211+
inline static void insert_free_block_lifo(void *bp)
212+
{
213+
size_t size = GET_SIZE(HDRP(bp));
214+
void *class_ptr = get_class_ptr(size);
215+
insert_free_block_after(class_ptr, bp);
188216
}
189217

190218
/*
@@ -296,7 +324,7 @@ static void *coalesce(void *bp)
296324
PUT(FTRP(NEXT_BLKP(bp)), PACK(size, 0));
297325
bp = PREV_BLKP(bp);
298326
}
299-
insert_free_block_address_order(bp);
327+
insert_free_block(bp);
300328
return bp;
301329
}
302330

@@ -351,7 +379,7 @@ static void place(void *bp, size_t size)
351379
PACK(size, 1), // allocated block
352380
PACK(total_size - size, 0) // free block
353381
);
354-
insert_free_block_address_order(free_bp);
382+
insert_free_block(free_bp);
355383
} else {
356384
PUT(HDRP(bp), PACK(total_size, 1));
357385
PUT(FTRP(bp), PACK(total_size, 1));
@@ -466,7 +494,7 @@ void *realloc1(void *oldptr, size_t size)
466494
split_block(next_block,
467495
PACK(first_block_size, 1),
468496
PACK(second_block_size, 0));
469-
insert_free_block_address_order(free_block);
497+
insert_free_block(free_block);
470498
// change the size of the new block
471499
PUT(HDRP(oldptr), PACK(size, 1));
472500
PUT(FTRP(oldptr), PACK(size, 1));

0 commit comments

Comments
 (0)