O(1) free
This commit is contained in:
parent
c28179f9d4
commit
92c53d53a8
1 changed files with 18 additions and 12 deletions
30
axl_memory.c
30
axl_memory.c
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue