diff --git a/axl_memory.c b/axl_memory.c index 1a08353..ae0f72e 100644 --- a/axl_memory.c +++ b/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; } } }