#define ARENA_HEADER_SIZE 128 #define ARENA_COMMIT_SIZE (64 * 1024) #define ARENA_RESERVE_SIZE (64 * 1024 * 1024) struct Arena { Arena *prev; Arena *cur; u64 base_pos; u64 pos; u64 cmt; u64 res; u64 align; u64 mem_used; u64 mem_peak_used; }; struct Temp { Arena *arena; u64 pos; }; struct Thread_Ctx { Arena *arenas[2]; }; #define countof(a) (sizeof(a) / sizeof((a)[0])) internal Arena *arena_alloc(); internal void arena_release(Arena *arena); internal Arena *tctx_get_scratch(Arena **conflicts, u64 count); #define scratch_begin(conflicts, count) temp_begin(tctx_get_scratch((conflicts), (count))) #define scratch_end(scratch) temp_end(scratch)