Oh no, there are nomads in my allocator!

This commit is contained in:
NukeBird 2025-11-23 21:58:18 +03:00
parent ce80c87438
commit 34f8746e27
2 changed files with 28 additions and 5 deletions

View file

@ -15,6 +15,7 @@ typedef struct mb_header mb_header;
#define MB_HEADER_SIZE sizeof(mb_header) #define MB_HEADER_SIZE sizeof(mb_header)
static mb_header* root = NULL; static mb_header* root = NULL;
static mb_header* nomad = NULL;
void* axl_memset(void* ptr, i8 c, u32 n) 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* 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) if(block->is_free && block->size >= req_size)
{ {
return block; return block;
} }
block = block->next; 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; return NULL;
@ -98,6 +113,12 @@ void* axl_malloc(u32 size)
axl_split_mb(free_block, size); axl_split_mb(free_block, size);
free_block->is_free = false; free_block->is_free = false;
nomad = free_block->next;
if(!nomad)
{
nomad = root;
}
return (void*)((u8*)free_block + MB_HEADER_SIZE); return (void*)((u8*)free_block + MB_HEADER_SIZE);
} }
@ -113,6 +134,8 @@ void axl_free(void* ptr)
mb_header* prev_block = block->prev; mb_header* prev_block = block->prev;
block->is_free = true; block->is_free = true;
mb_header* free_block = block;
if(next_block != NULL && next_block->is_free) if(next_block != NULL && next_block->is_free)
{ {
block->size += next_block->size + MB_HEADER_SIZE; block->size += next_block->size + MB_HEADER_SIZE;
@ -131,5 +154,8 @@ void axl_free(void* ptr)
{ {
prev_block->next->prev = prev_block; prev_block->next->prev = prev_block;
} }
free_block = prev_block;
} }
nomad = free_block;
} }

3
main.c
View file

@ -1,5 +1,4 @@
#include "axl.h" #include "axl.h"
#include <windows.h>
int _start(void) int _start(void)
{ {
@ -15,8 +14,6 @@ int _start(void)
(void)fds; (void)fds;
(void)f; (void)f;
Sleep(2);
while(true){} while(true){}
return 0; return 0;