diff options
Diffstat (limited to 'src/free_list.c')
| -rw-r--r-- | src/free_list.c | 28 |
1 files changed, 11 insertions, 17 deletions
diff --git a/src/free_list.c b/src/free_list.c index ee9e571..11fb59b 100644 --- a/src/free_list.c +++ b/src/free_list.c @@ -43,7 +43,7 @@ void *fl_split_node(free_nd **free_list, free_nd *split_nd, size_t size) { void fl_coalesce_nodes(free_nd *free_list) { for (free_nd *nd = free_list; nd; nd = nd->next) { - if ((size_t)nd + sizeof(header) == (size_t)nd->next) { + if ((size_t)nd + sizeof(header) + nd->size == (size_t)nd->next) { nd->size += sizeof(header) + nd->next->size; nd->next = nd->next->next; } @@ -52,24 +52,18 @@ void fl_coalesce_nodes(free_nd *free_list) { void fl_add_node(free_nd **free_list, void *ptr) { free_nd *new_nd = (free_nd *)ptr; - new_nd->next = NULL; - new_nd->size = ((header*)(ptr - sizeof(header)))->size; - - if (!(*free_list)) { - *free_list = new_nd; - return; - } + free_nd **insert_point = free_list; for (free_nd *nd = *free_list; nd; nd = nd->next) { - if (nd->next > new_nd) { - new_nd->next = nd->next; - nd->next = new_nd; - return; + if (nd < new_nd) { + insert_point = &nd->next; + } else { + break; } } - /* if we get here, then the new node must go before the current head */ - new_nd->next = *free_list; - *free_list = new_nd; - return; -} + new_nd->next = *insert_point; + new_nd->size = ((header*)(ptr - sizeof(header)))->size; + + *insert_point = new_nd; + } |