aboutsummaryrefslogtreecommitdiff
path: root/malloclab-handout/util
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-24 10:03:57 +0000
committer_ov4 <ov4@ov4.org>2026-10-24 10:03:57 +0000
commit1fa6d12e0c0a2b9a383c946be39b4d6f09c5f826 (patch)
treecb2176d259d786df5275717725983481741ce95d /malloclab-handout/util
parente63c392e4bf94df332827e45a45a52a9e0b92f44 (diff)
implement free
Perf index = 40 (util) + 5 (thru) = 45/100
Diffstat (limited to 'malloclab-handout/util')
-rw-r--r--malloclab-handout/util/mm-naive-free.h86
1 files changed, 86 insertions, 0 deletions
diff --git a/malloclab-handout/util/mm-naive-free.h b/malloclab-handout/util/mm-naive-free.h
new file mode 100644
index 0000000..47a9f02
--- /dev/null
+++ b/malloclab-handout/util/mm-naive-free.h
@@ -0,0 +1,86 @@
+#pragma once
+
+#include <cstring>
+
+#include "../mm.h"
+#include "../memlib.h"
+
+
+using namespace std;
+
+/* single word (4) or double word (8) alignment */
+#define ALIGNMENT 8
+
+
+inline constexpr bool OV4_VERBOSE = true;
+
+/* rounds up to the nearest multiple of ALIGNMENT */
+inline size_t align(size_t size)
+{
+ return (((size) + (ALIGNMENT-1)) & ~0x7);
+}
+
+inline constexpr size_t SIZE_T_SIZE = 8;
+
+inline bool is_alloc(size_t status)
+{
+ return (status&0x1);
+}
+inline bool is_prev_alloc(size_t status)
+{
+ return (status&0x2) >> 1;
+}
+inline void set_alloc(size_t &status, bool is_alloc)
+{
+ if (is_alloc)
+ status |= 0x1;
+ else
+ status &= 0xfffffffe;
+}
+inline void set_prev_alloc(size_t &status, bool is_prev_alloc)
+{
+ if (is_prev_alloc)
+ status |= 0x2;
+ else
+ status &= 0xfffffffd;
+}
+inline size_t get_size(size_t status)
+{
+ // ignore lowest 2 bits
+ return status&0xfffffffc;
+}
+inline void set_size(size_t &status, size_t size)
+{
+ status &= 0x3;
+ status |= (size & 0xfffffffc);
+}
+inline size_t offset(size_t p)
+{
+ return (size_t)((size_t)p-(size_t)mem_heap_lo());
+}
+inline void next(size_t &p)
+{
+ p += get_size(*(size_t*)p);
+}
+
+template< class... Args >
+void loggerln( std::format_string<Args...> fmt, Args&&... args ) { if constexpr (OV4_VERBOSE) println(fmt, forward<Args>(args)...); }
+
+template< class... Args >
+void logger( std::format_string<Args...> fmt, Args&&... args ) { if constexpr (OV4_VERBOSE) print(fmt, forward<Args>(args)...); }
+
+
+void print_list()
+{
+ logger("print_list: ");
+ size_t p = (size_t)mem_heap_lo();
+ while (true)
+ {
+ if (p >= (size_t)mem_heap_hi())
+ break;
+
+ logger("{} ", offset(p));
+ p += get_size(*(size_t*)p);
+ }
+ loggerln("");
+} \ No newline at end of file