diff --git a/src/allocator.c b/src/allocator.c index f53b84b7034a59a91185e96807215adebec102d6..59c6e5097f67443b933c168f58e791ab2684301b 100644 --- a/src/allocator.c +++ b/src/allocator.c @@ -86,7 +86,11 @@ void* h_arena_malloc(HArena *arena, size_t size) { return link->rest; } } - + +void h_arena_free(HArena *arena, void* ptr) { + // To be used later... +} + void h_delete_arena(HArena *arena) { struct arena_link *link = arena->head; while (link) { diff --git a/src/allocator.h b/src/allocator.h index 3ec9ae90a3638a8b694616735165e71c543da996..3af22d04ed19c2e6043d5b1af3d73c7685f9d8d4 100644 --- a/src/allocator.h +++ b/src/allocator.h @@ -23,6 +23,7 @@ typedef struct HArena_ HArena ; // hidden implementation HArena *h_new_arena(size_t block_size); // pass 0 for default... void* h_arena_malloc(HArena *arena, size_t count) __attribute__(( malloc, alloc_size(2) )); +void h_arena_free(HArena *arena, void* ptr); // For future expansion, with alternate memory managers. void h_delete_arena(HArena *arena); typedef struct { diff --git a/src/datastructures.c b/src/datastructures.c index 004f7e7bc35f541e75c79ce35df6f77b57062059..e7552e57adb7c0fe183e51e7cf278a24e6bdbdb6 100644 --- a/src/datastructures.c +++ b/src/datastructures.c @@ -30,3 +30,36 @@ void h_carray_append(HCountedArray *array, void* item) { } array->elements[array->used++] = item; } + +// HSlist + +HSlist* h_slist_new(HArena *arena) { + HSlist *ret = h_arena_malloc(arena, sizeof(HSlist)); + ret->head = NULL; + ret->arena = arena; + return ret; +} + +void* h_slist_pop(HSlist *slist) { + HSlistNode *head = slist->head; + if (!head) + return NULL; + void* ret = head->elem; + slist->head = head->next; + h_arena_free(slist->arena, head); + return ret; +} + +void h_slist_push(HSlist *slist, void* item) { + HSlistNode *hnode = h_arena_malloc(slist->arena, sizeof(HSlistNode)); + hnode->elem = item; + hnode->next = slist->head; + // write memory barrier here. + slist->head = hnode; +} + +void h_slist_free(HSlist *slist) { + while (slist->head != NULL) + h_slist_pop(slist); + h_arena_free(slist->arena, slist); +} diff --git a/src/internal.h b/src/internal.h index cc35a8b6ce0d1f8fffe6d2b98acb1ef0b06e276c..b59f8240ff5b2e2046d5a833442295fda2729ad1 100644 --- a/src/internal.h +++ b/src/internal.h @@ -154,6 +154,21 @@ HCountedArray *h_carray_new_sized(HArena * arena, size_t size); HCountedArray *h_carray_new(HArena * arena); void h_carray_append(HCountedArray *array, void* item); +typedef struct HSlistNode_ { + void* elem; + struct HSlistNode_ *next; +} HSlistNode; + +typedef struct HSlist_ { + HSlistNode *head; + struct HArena_ *arena; +} HSlist; + + +HSlist* h_slist_new(HArena *arena); +void* h_slist_pop(HSlist *slist); +void h_slist_push(HSlist *slist, void* item); +void h_slist_free(HSlist *slist); #if 0 #include <malloc.h>