Arena *alloc_arena(U64 cap) { Arena *a; /* TODO(pryazha): Use OS specific memory allocator * (like VirtualAlloc on Windows or mmap on Linux) */ a = malloc(sizeof(Arena)); ASSERT(a); if (!cap) cap = PRB_DEFAULT_ALLOC_SIZE; a->mem = malloc(cap); ASSERT(a->mem); a->cap = cap; a->used = 0; return a; } void release_arena(Arena *a) { free(a->mem); MEM0STRUCT(a); free(a); } void *push_arena(Arena *a, U64 size) { ASSERT(a); ASSERT(a->used+size <= a->cap); void *r; r = a->mem+a->used; a->used += size; return r; } void pop_arena(Arena *a, U64 size) { ASSERT(a); U64 clamped; clamped = CLAMPTOP(size, a->used); a->used = a->used-clamped; }