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; u32 size;
b8 is_free; b8 is_free;
struct mb_header* prev;
struct mb_header* next; struct mb_header* next;
}; };
@ -38,6 +39,7 @@ void axl_init(void)
root = (mb_header*)memory; root = (mb_header*)memory;
root->is_free = true; root->is_free = true;
root->next = NULL; root->next = NULL;
root->prev = NULL;
root->size = AXL_HEAP_SIZE - MB_HEADER_SIZE; root->size = AXL_HEAP_SIZE - MB_HEADER_SIZE;
axl_initialized = true; 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->size = block->size - size - MB_HEADER_SIZE;
new_block->is_free = true; new_block->is_free = true;
new_block->next = block->next; new_block->next = block->next;
new_block->prev = block;
if(new_block->next)
{
new_block->next->prev = new_block;
}
block->size = size; block->size = size;
block->next = new_block; 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* block = (mb_header*)((u8*)ptr - MB_HEADER_SIZE);
mb_header* next_block = block->next; mb_header* next_block = block->next;
mb_header* prev_block = block->prev;
block->is_free = true; block->is_free = true;
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;
block->next = next_block->next; 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) prev_block->next->prev = prev_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;
}
} }
} }
} }