summaryrefslogtreecommitdiff
path: root/freelist.h
diff options
context:
space:
mode:
authorWormHeamer2025-12-31 03:20:25 -0500
committerWormHeamer2025-12-31 03:20:25 -0500
commit79f562d94a908d3ebfc9ac68a577dbc70f12c450 (patch)
treefb37f0650dbb0041f273fe7427c6e7181f40d45d /freelist.h
parenta06101376e750a7ba57857a6ed6917e9e5503d71 (diff)
allow opening multiple files at once + replace modes
Diffstat (limited to 'freelist.h')
-rw-r--r--freelist.h31
1 files changed, 31 insertions, 0 deletions
diff --git a/freelist.h b/freelist.h
new file mode 100644
index 0000000..69ef976
--- /dev/null
+++ b/freelist.h
@@ -0,0 +1,31 @@
+#ifndef FREELIST_H
+#define FREELIST_H
+
+#include "arena.h"
+
+#define FREELIST_NEW(fl, a)\
+ (__typeof__(*(fl)))freelist_new((void**)(fl), sizeof(**(fl)), _Alignof(__typeof__(**(fl))), a)
+
+#define FREELIST_FREE(fl, p)\
+ freelist_free((void **)(fl), (void *)(p))
+
+static inline void *freelist_new(void **fl, size_t sz, size_t align, Arena *a) {
+ if (*fl) {
+ void *p = *fl;
+ void *next = *(void**)p;
+ *fl = next;
+ return p;
+ } else {
+ /* must pad and align for ptr to next in freelist */
+ if (sz < sizeof(void *)) sz = sizeof(void *);
+ if (align < _Alignof(void *)) align = _Alignof(void *);
+ return arena_alloc(a, sz, align);
+ }
+}
+
+static inline void freelist_free(void **fl, void *p) {
+ *(void **)p = *fl;
+ *fl = p;
+}
+
+#endif