#ifndef FREELIST_H #define FREELIST_H #include #include #include /* Align to nearest multiple of align */ static inline size_t align_up_to(size_t n, size_t align) { return (n + align - 1) & ~(align - 1); } /* Fiddle these around according to your need. Delete or check makefile */ #ifdef FREELIST_ALIGN #define ALIGN(x) (align_up_to(x, sizeof(void *))) #else #define ALIGN(x) (x) #endif typedef struct FreeListBlock FreeListBlock; typedef struct { FreeListBlock *free; uintptr_t start; uintptr_t end; size_t size; size_t allocated; } FreeList; int fl_init(FreeList *fl, uintptr_t start, uintptr_t end, size_t itemsize); int fl_free(FreeList *fl, void *ptr); int fl_is_managed(FreeList *fl, void *ptr); void *fl_alloc(FreeList *fl); size_t fl_check(FreeList *fl); size_t fl_allocated(FreeList *fl); size_t fl_available(FreeList *fl); size_t fl_capacity(FreeList *fl); float fl_utilization(FreeList *fl, size_t itemsize); #endif // FREELIST_H