#ifndef FREELIST_H #define FREELIST_H #include "arena.h" #include #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 memset(p, 0, sz); } 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