summaryrefslogtreecommitdiff
path: root/prb_memory.c
blob: a1604653b94325541640d65ed741d676a417f882 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Arena *arena_alloc(U64 cap)
{
	Arena *arena = 0;

	/* TODO(pryazha): Use OS specific memory allocator (like VirtualAlloc on Windows or mmap on Linux) */
	arena = malloc(sizeof(Arena));
	Assert(arena);

	if (!cap)
		cap = DEFAULT_ALLOC_SIZE;

	arena->mem = malloc(cap);
	Assert(arena->mem);
	arena->cap = cap;
	arena->used = 0;

	return arena;
}

void arena_release(Arena *arena)
{
	free(arena->mem);
	arena->mem = 0;
	arena->cap = 0;
	arena->used = 0;
	free(arena);
}

void *arena_push(Arena *arena, U64 size)
{
	Assert(arena->used+size <= arena->cap);
	void *r = arena->mem+arena->used;
	arena->used += size;
	return r;
}

void arena_pop(Arena *arena, U64 amount)
{
	Assert(arena);
	U64 clamped = ClampTop(amount, arena->used);
	arena->used = arena->used-clamped;
}