27 while ((value & 1) != 1) {
39 assert(arena !=
NULL);
40 assert(req_alignment != 0);
48 size_t chunk_size = DEFAULT_CHUNK;
50 if (chunk_size < req_size + req_alignment - 1) {
51 chunk_size = req_size + req_alignment - 1;
72 assert(arena !=
NULL);
73 assert(alignment != 0);
81 const uintptr_t limit = base + arena->
remaining;
93 const uintptr_t start = (limit - size) & ~(alignment - 1);
110 void *
const ret = (
void *)start;
117 assert(arena !=
NULL);
123 void *ptr =
alloc(arena, alignment, size);
128 ptr =
alloc(arena, alignment, size);
135 assert(arena !=
NULL);
138 const size_t len = strlen(
s);
148 assert(arena !=
NULL);
163 assert(arena !=
NULL);
Memory allocation wrappers that exit on failure.
static void * gv_alloc(size_t size)
void gv_arena_reset(arena_t *arena)
static void more_core(arena_t *arena, size_t req_alignment, size_t req_size)
static void * alloc(arena_t *arena, size_t alignment, size_t size)
void * gv_arena_alloc(arena_t *arena, size_t alignment, size_t size)
char * gv_arena_strdup(arena_t *arena, const char *s)
static UNUSED bool is_power_of_2(size_t value)
popcount(value) == 1?
void gv_arena_free(arena_t *arena, void *ptr, size_t size)
Region-based memory allocator.
struct arena_chunk arena_chunk_t
macros for interacting with Address Sanitizer
#define ASAN_POISON(addr, size)
#define ASAN_UNPOISON(addr, size)
static double len(glCompPoint p)
arena_chunk_t * previous
previous chunk that was in use
arena_chunk_t * source
current chunk being allocated out of
size_t remaining
number of free bytes remaining in source
abstraction for squashing compiler warnings for unused symbols