diff options
| author | WormHeamer | 2025-12-31 03:20:25 -0500 |
|---|---|---|
| committer | WormHeamer | 2025-12-31 03:20:25 -0500 |
| commit | 79f562d94a908d3ebfc9ac68a577dbc70f12c450 (patch) | |
| tree | fb37f0650dbb0041f273fe7427c6e7181f40d45d /freelist.h | |
| parent | a06101376e750a7ba57857a6ed6917e9e5503d71 (diff) | |
allow opening multiple files at once + replace modes
Diffstat (limited to 'freelist.h')
| -rw-r--r-- | freelist.h | 31 |
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 |
