rsys

Basic data structures and low-level features
git clone git://git.meso-star.fr/rsys.git
Log | Files | Refs | README | LICENSE

commit 2f4bf95d429a17f0bc24eb0c1c63754b936ab7f5
parent 50ca94e819c603cf483d2af98dd9c5bbb5f3b140
Author: vaplv <vaplv@free.fr>
Date:   Tue, 26 Nov 2013 18:01:41 +0100

Pursue the free list implementation

Diffstat:
Msrc/free_list.h | 14+++++++++++---
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; }