aboutsummaryrefslogtreecommitdiff
path: root/malloclab-handout/mm-implicit.cc
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-11-03 06:28:20 +0000
committer_ov4 <ov4@ov4.org>2026-11-03 06:28:20 +0000
commit25e78c6e27044b96812a15ebc85c9b6064053518 (patch)
treef30d1139b0fc945bcb372fe20c90496ceee716f9 /malloclab-handout/mm-implicit.cc
parenteb47984a47e0baa5a95cd25cf6b4d745429d42e6 (diff)
fix prev_alloc
Diffstat (limited to 'malloclab-handout/mm-implicit.cc')
-rw-r--r--malloclab-handout/mm-implicit.cc20
1 files changed, 16 insertions, 4 deletions
diff --git a/malloclab-handout/mm-implicit.cc b/malloclab-handout/mm-implicit.cc
index f38032d..0cfc13f 100644
--- a/malloclab-handout/mm-implicit.cc
+++ b/malloclab-handout/mm-implicit.cc
@@ -67,6 +67,7 @@ void *mm_malloc(size_t size)
loggerln("---------- malloc ----------");
loggerln("argument: {}", size);
print_list();
+
size_t newsize = align(size + SIZE_T_SIZE);
loggerln("newsize: {}", newsize);
size_t p = (size_t)mem_heap_lo();
@@ -74,7 +75,6 @@ void *mm_malloc(size_t size)
while (true)
{
- //if (newsize == 4080) sleep(1);
size_t status = 0;
loggerln("offset: {}", (size_t)p-(size_t)mem_heap_lo());
@@ -91,9 +91,10 @@ void *mm_malloc(size_t size)
set_size(status, newsize);
set_alloc(status, false);
- set_prev_alloc(status, true); // TODO
+ set_prev_alloc(status, prev_alloc); // TODO
*(size_t*)p = status;
}
+
status = *(size_t*)p;
if (is_alloc(status))
{
@@ -101,11 +102,14 @@ void *mm_malloc(size_t size)
prev_alloc = true;
continue;
}
- prev_alloc = false;
+
+ // is free
+ // but too small
if (get_size(status) < newsize)
{
next(p);
+ prev_alloc = false;
continue;
}
@@ -113,7 +117,7 @@ void *mm_malloc(size_t size)
set_size(status, newsize);
set_alloc(status, true);
- set_prev_alloc(status, true); // TODO
+ set_prev_alloc(status, prev_alloc); // TODO
*(size_t*)p = status;
void *ret = (void*)((char*)p + SIZE_T_SIZE);
@@ -131,6 +135,14 @@ void *mm_malloc(size_t size)
sync_footer(free_header_p);
loggerln("split free: free begins {}", offset(free_header_p));
}
+ // use all of free space
+ // so need to update next prev_alloc
+ else
+ {
+ size_t p_next = get_size(*(size_t*)p);
+ if (p_next <= (size_t)mem_heap_hi())
+ set_prev_alloc(*(size_t*)p, true);
+ }
loggerln("return: {}" , (size_t)ret-(size_t)mem_heap_lo());
return ret;