46#include <stdnoreturn.h>
53#define ARENA_MIN_BUFFER_SIZE (64 * 1024)
55#define ARENA_GROWTH_FACTOR 2
57#define ARENA_MAX_BUFFER_SIZE (16 * 1024 * 1024)
62#ifdef DEBUG_ARENA_ALLOC
63#define DEBUG_PRINT(...) fprintf(stderr, __VA_ARGS__)
65#define DEBUG_PRINT(...) ((void)0)
68#ifdef DEBUG_ARENA_ALLOC
69static int active_buffers = 0;
71#define TRACK_ALLOC(ptr) \
75 DEBUG_PRINT("ALLOC %p (count=%d)\n", ptr, active_buffers); \
78#define TRACK_FREE(ptr) \
82 DEBUG_PRINT("FREE %p (count=%d)\n", ptr, active_buffers); \
85#define TRACK_ALLOC(ptr) ((void)0)
86#define TRACK_FREE(ptr) ((void)0)
170 size_t new_size,
size_t alignment);
218 size_t initial_capacity,
size_t item_size);
232noreturn
void die(
const char *fmt, ...);
249void *
xcalloc(
size_t nr,
size_t size);
size_t arena_get_total_allocated(ArenaAllocator *arena)
Gets the total number of bytes allocated across all buffers.
Definition memory.c:465
void arena_print_stats(ArenaAllocator *arena)
Prints statistics about arena memory usage.
Definition memory.c:479
void arena_destroy(ArenaAllocator *arena)
Frees all memory used by the arena.
Definition memory.c:434
char * xstrdup(const char *str)
Duplicates a string and checks for allocation failure.
Definition memory.c:105
void * arena_alloc(ArenaAllocator *arena, size_t size, size_t alignment)
Allocates memory from the arena.
Definition memory.c:284
noreturn void die(const char *fmt,...)
Prints a fatal error message and exits the program.
Definition memory.c:50
void * xcalloc(size_t nr, size_t size)
Allocates zero-init memory and checks for allocation failure. If !size it will still return a valid p...
Definition memory.c:86
void * growable_array_push(GrowableArray *arr)
Pushes a new element onto the growable array.
Definition memory.c:571
int arena_allocator_init(ArenaAllocator *arena, size_t initial_size)
Initializes an arena allocator.
Definition memory.c:211
void * arena_realloc(ArenaAllocator *arena, void *ptr, size_t old_size, size_t new_size, size_t alignment)
Reallocates memory from the arena allocator.
Definition memory.c:342
bool growable_array_init(GrowableArray *arr, ArenaAllocator *arena, size_t initial_capacity, size_t item_size)
Initializes a growable array using an arena allocator.
Definition memory.c:531
void arena_reset(ArenaAllocator *arena)
Resets the arena, keeping buffers but making them empty.
Definition memory.c:420
char * arena_strdup(ArenaAllocator *arena, const char *str)
Duplicates a string into arena-managed memory.
Definition memory.c:512
Buffer * buffer_create(size_t s, size_t alignment)
Creates a new buffer with given size and alignment.
Definition memory.c:161
void * xmalloc(size_t size)
Allocates memory and checks for allocation failure. If !size it will still return a valid pointer tha...
Definition memory.c:68
Arena allocator structure.
Definition memory.h:101
size_t offset
Definition memory.h:102
size_t total_allocated
Definition memory.h:106
Buffer * head
Definition memory.h:104
Buffer * buffer
Definition memory.h:103
size_t next_buffer_size
Definition memory.h:105
Represents a memory buffer in the arena.
Definition memory.h:92
size_t size
Definition memory.h:93
char * ptr
Definition memory.h:95
struct Buffer * next
Definition memory.h:94
Growable array backed by an arena allocator.
Definition memory.h:112
void * data
Definition memory.h:113
size_t count
Definition memory.h:114
size_t item_size
Definition memory.h:116
ArenaAllocator * arena
Definition memory.h:117
size_t capacity
Definition memory.h:115