This commit is contained in:
Judah Caruso 2026-02-18 23:31:03 -07:00
parent df60b5f76f
commit 4ebbaaa462
2 changed files with 54 additions and 14 deletions

View file

@ -1,23 +1,27 @@
#include <string.h>
#include <stdlib.h>
#include <assert.h>
typedef enum { arena__alloc, arena__reset, arena__release } arena__action;
typedef enum { arena__alloc, arena__reset, arena__save, arena__restore, arena__release } arena__action;
typedef void* (^Arena)(arena__action, usize, usize, usize*, const char*, sreg);
typedef void* (^Arena)(arena__action, usize, usize, void*, const char*, sreg);
#define arena_new(A, T) cast(T*, A(arena__alloc, sizeof(T), alignof(T), 0, __FILE__, __LINE__))
#define arena_make(A, C, T) cast(T*, A(arena__alloc, sizeof(T) * (C), alignof(T), 0, __FILE__, __LINE__))
#define arena_reset(A) A(arena__reset, 0, 0, 0, __FILE__, __LINE__)
#define arena_release(A) A(arena__release, 0, 0, 0, __FILE__, __LINE__)
#define arena_save(A, SP) A(arena__save, 0, 0, (SP), __FILE__, __LINE__)
#define arena_restore(A, SP) A(arena__restore, 0, 0, (SP), __FILE__, __LINE__)
// just a nice macro to make these easier to write
#define func(a1, a2, a3, a4, a5, a6) ^void* (arena__action a1, usize a2, usize a3, usize* a4, const char* a5, sreg a6)
#define func(a1, a2, a3, a4, a5, a6) ^void* (arena__action a1, usize a2, usize a3, void* a4, const char* a5, sreg a6)
static Arena
Static(u8* data, usize count) {
memset(data, 0, count);
capture usize offset = 0;
return closure(func(action, size, align, _1, _2, _3) {
return closure(func(action, size, align, savepoint, _2, _3) {
switch (action) {
default: {
} break;
@ -35,6 +39,16 @@ Static(u8* data, usize count) {
case arena__reset: {
offset = 0;
} break;
case arena__save: {
assert(savepoint != NULL && "Static: savepoint was null");
*cast(usize*, savepoint) = offset;
} break;
case arena__restore: {
assert(savepoint != NULL && "Static: savepoint was null");
offset = *cast(usize*, savepoint);
} break;
}
return 0;
@ -63,6 +77,8 @@ Logger(Arena arena) {
case arena__alloc: action_str = "alloc"; break;
case arena__reset: action_str = "reset"; break;
case arena__release: action_str = "release"; break;
case arena__save: action_str = "save"; break;
case arena__restore: action_str = "restore"; break;
}
printf("[ARENA] %s:%zd: %s (%zu, %zu)\n", file, line, action_str, size, align);
@ -70,4 +86,18 @@ Logger(Arena arena) {
});
}
static Arena
Region(Arena arena) {
capture usize savepoint = 0;
arena_save(arena, &savepoint);
return closure(func(action, size, align, _, file, line) {
if (action == arena__reset || action == arena__restore) {
return arena(arena__restore, size, align, &savepoint, file, line);
}
return arena(action, size, align, &savepoint, file, line);
});
}
#undef func

View file

@ -2,7 +2,6 @@
#include "base.c"
#include "arena.c"
#define SOKOL_IMPL
#ifdef PLATFORM_WINDOWS
#define SOKOL_D3D11
@ -14,6 +13,7 @@
#error "unsupported platform"
#endif
#define SOKOL_IMPL
#include "sokol/sokol_app.h"
#include "sokol/sokol_gfx.h"
#include "sokol/sokol_glue.h"
@ -64,6 +64,16 @@ init(void) {
sreg* a = arena_new(arena, sreg);
sreg* b = arena_new(arena, sreg);
{
auto region = Region(arena);
scope_exit { arena_reset(region); };
arena_make(region, 10, sreg);
arena_make(region, 10, f32);
arena_make(region, 10, bool);
}
sreg* c = arena_new(arena, sreg);
*a = 1024;