"better" heap freeing
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 17 Jan 2022 04:00:55 +0000 (22:00 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 17 Jan 2022 04:00:55 +0000 (22:00 -0600)
core/alloc/heap.onyx

index 959b5d8aaaa1171026f3f2118dbddb313b83edb0..e20a5712c7f22268b09e90164dabd2f73dd62b29 100644 (file)
@@ -65,11 +65,11 @@ get_freed_size :: () => {
 
     heap_block :: struct {
         size         : u32;
-        magic_number : u32;
     }
 
     heap_freed_block :: struct {
         use base: heap_block;
+        magic_number : u32;
         next : ^heap_freed_block;
         prev : ^heap_freed_block;
     }
@@ -200,6 +200,21 @@ get_freed_size :: () => {
             }
         }
 
+        {
+            walker := heap_state.free_list;
+            while walker != null {
+                after_block := cast(^heap_freed_block) (cast(uintptr) walker + walker.size);
+                if after_block == hb_ptr {
+                    hb_ptr.next = null;
+                    hb_ptr.prev = null;
+
+                    walker.size += hb_ptr.size;
+                    return;
+                }
+                walker = walker.next;
+            }
+        }
+
         hb_ptr.magic_number = Free_Block_Magic_Number;
         hb_ptr.prev = null;
         hb_ptr.next = heap_state.free_list;