summaryrefslogtreecommitdiff
path: root/include/cmmm
diff options
context:
space:
mode:
Diffstat (limited to 'include/cmmm')
-rw-r--r--include/cmmm/arena.h140
1 files changed, 140 insertions, 0 deletions
diff --git a/include/cmmm/arena.h b/include/cmmm/arena.h
new file mode 100644
index 0000000..07c9bef
--- /dev/null
+++ b/include/cmmm/arena.h
@@ -0,0 +1,140 @@
1#ifndef INCLUDED__CMMM__ARENA__H
2#define INCLUDED__CMMM__ARENA__H
3
4// NOTE(cmmm): this implementation assumes that allocations are made
5// at the end, so that we can take advantage of checkpoints. The
6// downside is that we can't allocate from previous chunks even if
7// there is space left in them...
8
9// NOTE(cmmm): coalescing is nice, but while you're building an
10// "object", it may be split across multiple chunks
11
12#include <stddef.h>
13
14// #define CMMM__ARENA__NO_STDIO
15// #define CMMM__ARENA__STRIP_VENDOR
16
17#ifndef CMMM__ARENA__FIRST_CHUNK_SIZE
18#define CMMM__ARENA__FIRST_CHUNK_SIZE (4 << 10)
19#endif
20
21#ifndef CMMM__ARENA__CHUNK_GROWTH_FACTOR
22#define CMMM__ARENA__CHUNK_GROWTH_FACTOR 2
23#endif
24
25struct cmmm__arena__chunk {
26 struct cmmm__arena__chunk *next;
27 char *free;
28 char *end;
29 char data[];
30};
31
32#define CMMM__ARENA struct cmmm__arena *
33struct cmmm__arena {
34 struct cmmm__arena__chunk *head;
35 struct cmmm__arena__chunk *tail;
36};
37
38struct cmmm__arena__checkpoint {
39 struct cmmm__arena__chunk *tail;
40 char *free;
41};
42
43#ifndef ALIGNOF
44#if __STDC_VERSION__ >= 202311L
45#define ALIGNOF alignof
46#elif __STDC_VERSION__ >= 201112L
47#define ALIGNOF _Alignof
48#else
49#define ALIGNOF(O) offsetof (struct { char _; typeof (O) x; }, x)
50#endif
51#endif
52
53#define CMMM__ARENA__RESERVE( A, T) cmmm__arena__reserve ((A), sizeof (T), ALIGNOF (T))
54#define CMMM__ARENA__RESERVE_ARRAY( A, N, T) cmmm__arena__reserve ((A), (N)*sizeof (T), ALIGNOF (T))
55#define CMMM__ARENA__ALLOCATE( A, T) cmmm__arena__allocate ((A), sizeof (T), ALIGNOF (T))
56#define CMMM__ARENA__ALLOCATE_ARRAY( A, N, T) cmmm__arena__allocate ((A), (N)*sizeof (T), ALIGNOF (T))
57#define CMMM__ARENA__ALLOCATE_FAST( A, T) cmmm__arena__allocate_fast ((A), sizeof (T), ALIGNOF (T))
58#define CMMM__ARENA__ALLOCATE_ARRAY_FAST(A, N, T) cmmm__arena__allocate_fast ((A), (N)*sizeof (T), ALIGNOF (T))
59#define CMMM__ARENA__ZERO( A, T) cmmm__arena__zero ((A), sizeof (T), ALIGNOF (T))
60#define CMMM__ARENA__ZERO_ARRAY( A, N, T) cmmm__arena__zero ((A), (N)*sizeof (T), ALIGNOF (T))
61void *cmmm__arena__reserve (struct cmmm__arena *, size_t size, size_t alignment);
62void *cmmm__arena__allocate (struct cmmm__arena *, size_t size, size_t alignment);
63void *cmmm__arena__allocate_fast (struct cmmm__arena *, size_t size, size_t alignment);
64void *cmmm__arena__zero (struct cmmm__arena *, size_t size, size_t alignment);
65
66size_t cmmm__arena__room (const struct cmmm__arena *, size_t alignment);
67void *cmmm__arena__next_free (const struct cmmm__arena *, size_t alignment);
68
69#define CMMM__ARENA__COPY( A, F, T) cmmm__arena__copy ((A), (F), sizeof (T), ALIGNOF (T))
70#define CMMM__ARENA__COPY_ARRAY(A, F, N, T) cmmm__arena__copy ((A), (F), (N)*sizeof (T), ALIGNOF (T))
71void *cmmm__arena__copy (struct cmmm__arena *, const void *, size_t size, size_t alignment);
72char *cmmm__arena__copy_cstr (struct cmmm__arena *, const char *);
73
74void cmmm__arena__reset (struct cmmm__arena *);
75
76struct cmmm__arena__checkpoint cmmm__arena__checkpoint (struct cmmm__arena *);
77size_t cmmm__arena__checkpoint__size_from (struct cmmm__arena__checkpoint);
78void cmmm__arena__rollback_to (struct cmmm__arena *, struct cmmm__arena__checkpoint);
79void *cmmm__arena__coalesce_from (struct cmmm__arena *, struct cmmm__arena__checkpoint);
80void *cmmm__arena__coalesce_from_fast (struct cmmm__arena *, struct cmmm__arena__checkpoint, size_t size);
81
82void cmmm__arena__trim (struct cmmm__arena *);
83void cmmm__arena__free (struct cmmm__arena *);
84
85#ifndef CMMM__ARENA__NO_STDIO
86#include <stdarg.h>
87char *cmmm__arena__printf (struct cmmm__arena *, const char *format, ...);
88char *cmmm__arena__vprintf (struct cmmm__arena *, const char *format, va_list ap);
89#endif
90
91#ifdef CMMM__ARENA__STRIP_VENDOR
92#define ARENA__NO_STDIO CMMM__ARENA__NO_STDIO
93#define ARENA__STRIP_VENDOR CMMM__ARENA__STRIP_VENDOR
94
95#define ARENA__FIRST_CHUNK_SIZE CMMM__ARENA__FIRST_CHUNK_SIZE
96#define ARENA__CHUNK_GROWTH_FACTOR CMMM__ARENA__CHUNK_GROWTH_FACTOR
97
98#define arena__chunk cmmm__arena__chunk
99#define ARENA CMMM__ARENA
100#define arena__checkpoint cmmm__arena__checkpoint
101
102#define ARENA__RESERVE CMMM__ARENA__RESERVE
103#define ARENA__RESERVE_ARRAY CMMM__ARENA__RESERVE_ARRAY
104#define ARENA__ALLOCATE CMMM__ARENA__ALLOCATE
105#define ARENA__ALLOCATE_ARRAY CMMM__ARENA__ALLOCATE_ARRAY
106#define ARENA__ALLOCATE_FAST CMMM__ARENA__ALLOCATE_FAST
107#define ARENA__ALLOCATE_ARRAY_FAST CMMM__ARENA__ALLOCATE_ARRAY_FAST
108#define ARENA__ZERO CMMM__ARENA__ZERO
109#define ARENA__ZERO_ARRAY CMMM__ARENA__ZERO_ARRAY
110#define arena__reserve cmmm__arena__reserve
111#define arena__allocate cmmm__arena__allocate
112#define arena__allocate_fast cmmm__arena__allocate_fast
113#define arena__zero cmmm__arena__zero
114
115#define arena__room cmmm__arena__room
116#define arena__next_free cmmm__arena__next_free
117
118#define ARENA__COPY CMMM__ARENA__COPY
119#define ARENA__COPY_ARRAY CMMM__ARENA__COPY_ARRAY
120#define arena__copy cmmm__arena__copy
121#define arena__copy_cstr cmmm__arena__copy_cstr
122
123#define arena__reset cmmm__arena__reset
124
125#define arena__checkpoint cmmm__arena__checkpoint
126#define arena__rollback_to cmmm__arena__rollback_to
127#define arena__size_from cmmm__arena__size_from
128#define arena__coalesce_from cmmm__arena__coalesce_from
129#define arena__coalesce_from_fast cmmm__arena__coalesce_from_fast
130
131#define arena__trim cmmm__arena__trim
132#define arena__free cmmm__arena__free
133
134#ifndef CMMM__ARENA__NO_STDIO
135#define arena__printf cmmm__arena__printf
136#define arena__vprintf cmmm__arena__vprintf
137#endif
138#endif
139
140#endif // INCLUDED__CMMM__ARENA__H