Luma 0.1.0
A low-level compiled alternative to C, C++, and more!
Loading...
Searching...
No Matches
memory.h
Go to the documentation of this file.
1
41#pragma once
42
43#include <stdalign.h>
44#include <stdbool.h>
45#include <stddef.h>
46#include <stdnoreturn.h>
47
48#ifdef __cplusplus
49extern "C" {
50#endif
51
53#define ARENA_MIN_BUFFER_SIZE (64 * 1024) // 64KB minimum
55#define ARENA_GROWTH_FACTOR 2
57#define ARENA_MAX_BUFFER_SIZE (16 * 1024 * 1024) // 16MB maximum per buffer
58
60// #define DEBUG_ARENA_ALLOC 1
61
62#ifdef DEBUG_ARENA_ALLOC
63#define DEBUG_PRINT(...) fprintf(stderr, __VA_ARGS__)
64#else
65#define DEBUG_PRINT(...) ((void)0)
66#endif
67
68#ifdef DEBUG_ARENA_ALLOC
69static int active_buffers = 0;
71#define TRACK_ALLOC(ptr) \
72 do { \
73 if (ptr) \
74 active_buffers++; \
75 DEBUG_PRINT("ALLOC %p (count=%d)\n", ptr, active_buffers); \
76 } while (0)
78#define TRACK_FREE(ptr) \
79 do { \
80 if (ptr) \
81 active_buffers--; \
82 DEBUG_PRINT("FREE %p (count=%d)\n", ptr, active_buffers); \
83 } while (0)
84#else
85#define TRACK_ALLOC(ptr) ((void)0)
86#define TRACK_FREE(ptr) ((void)0)
87#endif
88
92typedef struct Buffer {
93 size_t size;
94 struct Buffer *next;
95 char *ptr;
97
108
112typedef struct {
113 void *data;
114 size_t count;
115 size_t capacity;
116 size_t item_size;
119
120/* =========================================================================
121 Buffer Management
122 ========================================================================= */
123
130Buffer *buffer_create(size_t s, size_t alignment);
131
132/* =========================================================================
133 Arena Allocator Functions
134 ========================================================================= */
135
142int arena_allocator_init(ArenaAllocator *arena, size_t initial_size);
143
151void *arena_alloc(ArenaAllocator *arena, size_t size, size_t alignment);
152
169void *arena_realloc(ArenaAllocator *arena, void *ptr, size_t old_size,
170 size_t new_size, size_t alignment);
171
176void arena_reset(ArenaAllocator *arena);
177
182void arena_destroy(ArenaAllocator *arena);
183
190char *arena_strdup(ArenaAllocator *arena, const char *str);
191
197
204
205/* =========================================================================
206 Growable Array Functions
207 ========================================================================= */
208
218 size_t initial_capacity, size_t item_size);
219
226
232noreturn void die(const char *fmt, ...);
233
240void *xmalloc(size_t size);
241
249void *xcalloc(size_t nr, size_t size);
250
256char *xstrdup(const char *str);
257
258#ifdef __cplusplus
259}
260#endif
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