#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)