O(1) free

This commit is contained in:
NukeBird 2025-11-23 21:19:18 +03:00
parent c28179f9d4
commit 92c53d53a8

View file

@ -6,6 +6,7 @@ struct mb_header
{
u32 size;
b8 is_free;
struct mb_header* prev;
struct mb_header* next;
};
@ -38,6 +39,7 @@ void axl_init(void)
root = (mb_header*)memory;
root->is_free = true;
root->next = NULL;
root->prev = NULL;
root->size = AXL_HEAP_SIZE - MB_HEADER_SIZE;
axl_initialized = true;
}
@ -67,6 +69,12 @@ void axl_split_mb(mb_header* block, u32 size)
new_block->size = block->size - size - MB_HEADER_SIZE;
new_block->is_free = true;
new_block->next = block->next;
new_block->prev = block;
if(new_block->next)
{
new_block->next->prev = new_block;
}
block->size = size;
block->next = new_block;
@ -102,28 +110,26 @@ void axl_free(void* ptr)
mb_header* block = (mb_header*)((u8*)ptr - MB_HEADER_SIZE);
mb_header* next_block = block->next;
mb_header* prev_block = block->prev;
block->is_free = true;
if(next_block != NULL && next_block->is_free)
{
block->size += next_block->size + MB_HEADER_SIZE;
block->next = next_block->next;
if(block->next)
{
block->next->prev = block;
}
}
if(block != root)
if(prev_block != NULL && prev_block->is_free)
{
for(mb_header* mb = root; mb != NULL; mb = mb->next)
prev_block->size += block->size + MB_HEADER_SIZE;
prev_block->next = block->next;
if(prev_block->next)
{
if(mb->next == block)
{
if(mb->is_free)
{
mb_header* prev_free_mb = mb;
prev_free_mb->size += block->size + MB_HEADER_SIZE;
prev_free_mb->next = block->next;
}
break;
}
prev_block->next->prev = prev_block;
}
}
}