diff options
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 |
