Merge remote-tracking branch 'thequux/master'

This commit is contained in:
Meredith L. Patterson 2012-10-08 18:14:18 +02:00
commit b6bf0ea30c
4 changed files with 54 additions and 1 deletions

View file

@ -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) {

View file

@ -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 {

View file

@ -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);
}

View file

@ -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>