Add arena_realloc_tail()

This commit is contained in:
Ole Morud
2023-06-03 11:37:06 +02:00
committed by Ole Morud
parent 51feaf1d00
commit 57979892f8
2 changed files with 31 additions and 9 deletions

View File

@@ -6,12 +6,14 @@
typedef struct arena {
void *begin,
*next;
*next,
*prev;
size_t cap;
} __attribute__((aligned(sizeof(void*)))) arena_t;
arena_t* arena_new();
void arena_reset(arena_t* a);
void* arena_alloc(arena_t* a, size_t len);
void* arena_realloc_tail(arena_t* a, size_t len);
#endif

View File

@@ -23,13 +23,13 @@ struct arena* arena_new()
arena_t* a = (arena_t*)p;
*a = (arena_t) {
.begin = p + sizeof(struct arena),
.next = p + sizeof(struct arena),
.cap = size - sizeof(struct arena)
};
void* beg = p + sizeof(struct arena);
a->begin = beg;
a->next = beg;
a->prev = beg;
a->cap = size - sizeof(struct arena);
return (arena_t*)a;
return a;
}
/*
@@ -38,6 +38,7 @@ struct arena* arena_new()
void arena_reset(struct arena* a)
{
a->next = a->begin;
a->prev = a->begin;
}
/*
@@ -46,12 +47,31 @@ void arena_reset(struct arena* a)
void* arena_alloc(struct arena* a, size_t len)
{
void* p = a->next;
a->next = (byte*)(a->next) + len;
if ((byte*)(a->next) > (byte*)(a->begin) + a->cap) {
if ((byte*)p + len > (byte*)(a->begin) + a->cap) {
errno = ENOMEM;
return NULL;
}
a->next = (byte*)(a->next) + len;
a->prev = p;
return p;
}
/*
* Reallocate last block in arena
*/
void* arena_realloc_tail(struct arena* a, size_t len)
{
void* p = a->prev;
if ((byte*)p + len > (byte*)(a->begin) + a->cap) {
errno = ENOMEM;
return NULL;
}
a->next = (byte*)p + len;
return a->prev;
}