commit 2f4bf95d429a17f0bc24eb0c1c63754b936ab7f5
parent 50ca94e819c603cf483d2af98dd9c5bbb5f3b140
Author: vaplv <vaplv@free.fr>
Date: Tue, 26 Nov 2013 18:01:41 +0100
Pursue the free list implementation
Diffstat:
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/src/free_list.h b/src/free_list.h
@@ -40,7 +40,7 @@ free_list_hold(struct free_list* list, struct free_id* id)
return list->items[id->index].free_item__.id.name == id->name;
}
-static FINLINE FREE_ITEM*
+static FINLINE FREE_ITEM_TYPE*
free_list_get(struct free_list* list, struct free_id* id)
{
ASSERT(list && id);
@@ -62,11 +62,19 @@ free_list_add(struct free_list* list)
id.index = list.head;
list.head = list.items[list.head].free_item__.next;
} else {
- FREE_ITEM item;
+ const uint32_t nitems_new = nitems ? nitems * 2 : 16;
+ FREE_ITEM_TYPE item;
memset(&item, 0, sizeof(FREE_ITEM));
+
id.index = list->nitems;
item.free_item__.id = id;
- list.items = MEM_REALLOC(list.items, nitems * 2 * sizeof(FREE_ITEM_TYPE));
+ list.items = MEM_REALLOC(list.items, nitems_new * sizeof(FREE_ITEM_TYPE));
+ FOR_EACH(uint32_t, iitem, nitems, nitems_new - 1) {
+ list->items[iitem].free_item__.next = iitem + 1;
+ }
+ list->items[nitems_new - 1].free_item__.next = UINT32_MAX;
+ list->head = nitems + 1;
+ list->nitems = nitems_new;
}
return id;
}