Merge remote-tracking branch 'thequux/master'
This commit is contained in:
commit
b6bf0ea30c
4 changed files with 54 additions and 1 deletions
|
|
@ -87,6 +87,10 @@ void* h_arena_malloc(HArena *arena, size_t size) {
|
|||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue