Add arena_delete()
This commit is contained in:
@@ -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
|
||||||
|
|||||||
18
src/arena.c
18
src/arena.c
@@ -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;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user