From 43b04a1bfaecfabe8b3460575db7be5d592f896b Mon Sep 17 00:00:00 2001 From: Thomas Voss Date: Tue, 16 Apr 2024 02:03:12 +0200 Subject: implement arena allocators --- include/alloc.h | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'include/alloc.h') diff --git a/include/alloc.h b/include/alloc.h index 6eb2a30..0855e01 100644 --- a/include/alloc.h +++ b/include/alloc.h @@ -3,7 +3,38 @@ #include +#include "_attrs.h" + +#ifndef MLIB_ARENA_BLKSIZE +# define MLIB_ARENA_BLKSIZE (8 * 1024) +#endif + +struct _region { + size_t len, cap; + void *data; + struct _region *next; +}; + +typedef struct { + struct _region *_head; + size_t _init; +} arena; + [[gnu::__returns_nonnull__]] void *bufalloc(void *, size_t, size_t); void *bufalloc_noterm(void *, size_t, size_t); +[[_mlib_pure, _mlib_inline]] +static inline arena +mkarena(size_t n) +{ + return (arena){._init = n ? n : MLIB_ARENA_BLKSIZE}; +} + +[[gnu::__malloc__, gnu::__alloc_size__(2, 3), gnu::__alloc_align__(4)]] +void *arena_alloc(arena *, size_t, size_t, size_t); +void arena_zero(arena *); +void arena_free(arena *); + +#define arena_new(a, T, n) ((T *)arena_alloc((a), sizeof(T), (n), alignof(T))) + #endif /* !MLIB_ALLOC_H */ -- cgit v1.2.3