aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/free_list.c28
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;
+ }