From 3a6c721ca2a745e2932671b9bdec53c09a6ec26e Mon Sep 17 00:00:00 2001
From: Ivo van Poorten <ivopvp@gmail.com>
Date: Tue, 10 Sep 2024 04:20:03 +0200
Subject: [PATCH] zmalloc: also add alloc at begin of first fit to test
 differences in speed and memory fragmentation. alloc at end is faster during
 loading. no data yet on memory fragmentation.

---
 lib/zmalloc.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/lib/zmalloc.c b/lib/zmalloc.c
index aaa9f617..63dad265 100644
--- a/lib/zmalloc.c
+++ b/lib/zmalloc.c
@@ -45,7 +45,20 @@ void *zmalloc(size_t size) {
     for (p = base; p && !(p->free && p->size >= size); p = p->next) ; // find
     if (!p) return NULL;
 
-    if (p->size - size > block_info_size) { // split, alloc at end
+    if (p->size - size > block_info_size) {
+#if 0
+        // split, alloc at begin
+        struct block_info *q = (void *) p + block_info_size + size;
+        q->next = p->next;
+        p->next = q;
+        q->prev = p;
+        if (q->next) q->next->prev = q;
+        q->size = p->size - block_info_size - size;
+        p->size = size;
+        q->free = 1;
+#endif
+#if 1
+        // split, alloc at end
         struct block_info *q = (void *) p + p->size - size;
         p->size -= size + block_info_size;
         q->size = size;
@@ -54,6 +67,7 @@ void *zmalloc(size_t size) {
         q->prev = p;
         if (q->next) q->next->prev = q;
         p = q;
+#endif
     }
 
     p->free = 0;