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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
#ifndef ARENA_H
#define ARENA_H
#include "base.h"
/**
* Arena Helper macro's
* */
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define ALIGN_UP_POW2(n, p) (((u64)(n) + ((u64)(p) - 1)) & (~((u64)(p) - 1)))
/*
* Represents a disk partition with major/minor device numbers and block count.
*/
/**
* replacing malloc/free with arena allocaters
*
* */
#define ARENA_BASE_POS (sizeof(mem_arena))
// void * for the size of a pointer on the machine, 64/32bit comp
#define ARENA_ALIGN (sizeof(void *))
static inline u64 KiB(u64 n) { return n << 10; }
static inline u64 MiB(u64 n) { return n << 20; }
static inline u64 GiB(u64 n) { return n << 30; }
typedef struct mem_arena mem_arena;
struct mem_arena
{
u64 capacity;
u64 pos;
} ;
// arena prototypes
mem_arena *
arena_create(u64 capacity);
// make it a void pointer to allow implicit conversion
void
arena_destroy(mem_arena *arena);
void *
arena_push(mem_arena *arena, u64 size, b32 non_zero);
void
arena_pop(mem_arena *arena, u64 size);
void
arena_pop_to(mem_arena *arena, u64 pos);
void
arena_clear(mem_arena *arena);
#define PUSH_STRUCT(arena, T) (T *)arena_push((arena), sizeof(T), 0)
#define PUSH_STRUCT_NZ(arena, T) (T *)arena_push((arena), sizeof(T), 1)
#define PUSH_ARRAY(arena, T, n) (T *)arena_push((arena), sizeof(T) * (n), 0)
#define PUSH_ARRAY_NZ(arena, T, n) (T *)arena_push((arena), sizeof(T) * (n), 1)
#endif
|