19#define SBL_ARENA_PUSH_STRUCT(arena, type) ((type*)sbl_arena_alloc((arena), sizeof(type)))
20#define SBL_ARENA_PUSH_STRUCT_ZERO(arena, type) ((type*)sbl_arena_alloc_zero((arena), sizeof(type)))
21#define SBL_ARENA_PUSH_ARRAY(arena, type, count) \
22 ((type*)sbl_arena_alloc((arena), sizeof(type) * (count)))
23#define SBL_ARENA_PUSH_ARRAY_ZERO(arena, type, count) \
24 ((type*)sbl_arena_alloc_zero((arena), sizeof(type) * (count)))
26#define SBL_ARENA_PUSH_STRING(arena, str) \
27 ((char*)SBL_ARENA_MEMCPY(sbl_arena_alloc((arena), strlen(str) + 1), (str), strlen(str) + 1))
63#ifndef SBL_ARENA_STATIC
64#if __STDC_VERSION__ >= 201112L
87#ifndef SBL_ARENA_MEMSET
89#define SBL_ARENA_MEMSET(dst, val, sz) memset(dst, val, sz)
92#ifndef SBL_ARENA_MEMCPY
94#define SBL_ARENA_MEMCPY(dst, src, sz) memcpy(dst, src, sz)
99#ifdef SBL_ARENA_IMPLEMENTATION
100#ifndef SBL_ARENA_IMPLEMENTATION_GUARD
101#define SBL_ARENA_IMPLEMENTATION_GUARD
106static uintptr_t sbl_arena__align_forward(uintptr_t ptr, uint64_t align) {
108 uintptr_t a = (uintptr_t)align;
109 uintptr_t mod = p & (a - 1);
116static SblArenaBlock* sbl_arena__block_create(uint64_t size) {
128 arena->
head = sbl_arena__block_create(initial_size);
130 return arena->
head != NULL;
145 if (!arena || !arena->
current)
return NULL;
150 uintptr_t aligned_ptr = sbl_arena__align_forward(curr_ptr, align);
151 uint64_t aligned_offset = aligned_ptr - ((uintptr_t)b +
sizeof(
SblArenaBlock));
153 if (aligned_offset + size > b->
size) {
158 aligned_ptr = sbl_arena__align_forward((uintptr_t)b +
sizeof(
SblArenaBlock), align);
163 while (next_to_free) {
169 uint64_t next_size = b->
size * 2;
170 if (size > next_size)
171 next_size = size * 2;
173 if (!next)
return NULL;
177 aligned_ptr = sbl_arena__align_forward((uintptr_t)b +
sizeof(
SblArenaBlock), align);
181 void* ptr = (
void*)aligned_ptr;
214#ifndef SBL_ARENA_STATIC
215#if __STDC_VERSION__ >= 201112L
struct SblArena SblArena
Arena allocator.
__thread int sbl_thread_arena_initialized
struct SblArenaBlock SblArenaBlock
A single block of memory in the arena.
SBL_ARENA_DEF SblArena * sbl_get_thread_arena(void)
SBL_ARENA_DEF void * sbl_arena_alloc_zero(SblArena *arena, uint64_t size)
SBL_ARENA_DEF SblArenaMark sbl_arena_mark(SblArena *arena)
SBL_ARENA_DEF void sbl_arena_reset(SblArena *arena)
SBL_ARENA_DEF void sbl_arena_free(SblArena *arena)
#define SBL_ARENA_MEMSET(dst, val, sz)
SBL_ARENA_DEF bool sbl_arena_init(SblArena *arena, uint64_t initial_size)
SBL_ARENA_DEF void sbl_arena_rewind(SblArena *arena, SblArenaMark mark)
__thread SblArena sbl_thread_arena
SBL_ARENA_DEF void * sbl_arena_alloc(SblArena *arena, uint64_t size)
A single block of memory in the arena.
struct SblArenaBlock * next
Bookmark for arena state.