From 34f8746e27e0e0204fd2d5a33eedc33ba38fdcad Mon Sep 17 00:00:00 2001 From: NukeBird Date: Sun, 23 Nov 2025 21:58:18 +0300 Subject: [PATCH] Oh no, there are nomads in my allocator! --- axl_memory.c | 30 ++++++++++++++++++++++++++++-- main.c | 3 --- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/axl_memory.c b/axl_memory.c index f0e50fe..98ff39e 100644 --- a/axl_memory.c +++ b/axl_memory.c @@ -15,6 +15,7 @@ typedef struct mb_header mb_header; #define MB_HEADER_SIZE sizeof(mb_header) static mb_header* root = NULL; +static mb_header* nomad = NULL; void* axl_memset(void* ptr, i8 c, u32 n) { @@ -47,15 +48,29 @@ void axl_init(void) mb_header* axl_find_mb(u32 req_size) { - mb_header* block = root; + mb_header* block = nomad ? nomad : root; + mb_header* start = block; - while(block != NULL) + while(block) { if(block->is_free && block->size >= req_size) { return block; } + block = block->next; + + if(!block) + { + //nomad pointer didn't help us, start from root + block = root; + } + + if(block == start) + { + //full circle, we didn't find a free memory block + break; + } } return NULL; @@ -98,6 +113,12 @@ void* axl_malloc(u32 size) axl_split_mb(free_block, size); free_block->is_free = false; + nomad = free_block->next; + if(!nomad) + { + nomad = root; + } + return (void*)((u8*)free_block + MB_HEADER_SIZE); } @@ -113,6 +134,8 @@ void axl_free(void* ptr) mb_header* prev_block = block->prev; block->is_free = true; + mb_header* free_block = block; + if(next_block != NULL && next_block->is_free) { block->size += next_block->size + MB_HEADER_SIZE; @@ -131,5 +154,8 @@ void axl_free(void* ptr) { prev_block->next->prev = prev_block; } + free_block = prev_block; } + + nomad = free_block; } diff --git a/main.c b/main.c index f8fff98..77e59a7 100644 --- a/main.c +++ b/main.c @@ -1,5 +1,4 @@ #include "axl.h" -#include int _start(void) { @@ -15,8 +14,6 @@ int _start(void) (void)fds; (void)f; - Sleep(2); - while(true){} return 0;