Add arena_delete()

This commit is contained in:
Ole Morud
2023-06-03 17:04:25 +02:00
committed by Ole Morud
parent d3754e64e5
commit 45e6023d42
2 changed files with 13 additions and 6 deletions

View File

@@ -16,5 +16,6 @@ void arena_reset(arena_t* a);
void* arena_alloc(arena_t* a, size_t len); void* arena_alloc(arena_t* a, size_t len);
void* arena_calloc(arena_t* a, size_t nmemb, size_t size); void* arena_calloc(arena_t* a, size_t nmemb, size_t size);
void* arena_realloc_tail(arena_t* a, size_t len); void* arena_realloc_tail(arena_t* a, size_t len);
void arena_delete(arena_t* a);
#endif #endif

View File

@@ -15,7 +15,7 @@
#define ARENA_SIZE ((size_t)(1 * sysconf(_SC_PAGE_SIZE))) #define ARENA_SIZE ((size_t)(1 * sysconf(_SC_PAGE_SIZE)))
struct arena arena_new() arena_t arena_new()
{ {
arena_t a = { arena_t a = {
.next = 0, .next = 0,
@@ -42,13 +42,13 @@ void _arena_realloc_or_panic(arena_t* a, size_t len)
a->cap = len; a->cap = len;
} }
void arena_reset(struct arena* a) void arena_reset(arena_t* a)
{ {
a->next = 0; a->next = 0;
a->prev = 0; a->prev = 0;
} }
void* arena_alloc(struct arena* a, size_t len) void* arena_alloc(arena_t* a, size_t len)
{ {
// align len to machine word size // align len to machine word size
len = (len + WORD_SIZE - 1) & ~(WORD_SIZE - 1); len = (len + WORD_SIZE - 1) & ~(WORD_SIZE - 1);
@@ -60,20 +60,26 @@ void* arena_alloc(struct arena* a, size_t len)
if (a->next > a->cap) if (a->next > a->cap)
_arena_realloc_or_panic(a, a->cap * 2); _arena_realloc_or_panic(a, a->cap * 2);
return (byte_t*)(a->data) + a->prev; return (byte_t*)(a->data) + a->prev;
} }
void* arena_calloc(struct arena* a, size_t nmemb, size_t size) void* arena_calloc(arena_t* a, size_t nmemb, size_t size)
{ {
void* p = arena_alloc(a, nmemb * size); void* p = arena_alloc(a, nmemb * size);
memset((byte_t*)(a->data) + a->prev, 0, size); memset((byte_t*)(a->data) + a->prev, 0, size);
return p; return p;
} }
void* arena_realloc_tail(struct arena* a, size_t len) void* arena_realloc_tail(arena_t* a, size_t len)
{ {
a->next = a->prev; a->next = a->prev;
return arena_alloc(a, len); return arena_alloc(a, len);
} }
void arena_delete(arena_t* a)
{
free(a->data);
arena_reset(a);
a->data = NULL;
}