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;
|
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue