#include "allocator.h" #include #include #include size_t align(size_t size, size_t al) { size_t padding = size % al; if (padding) padding = al - padding; size_t res; if (__builtin_uaddl_overflow(size, padding, &res)) return 0; return res; } struct blk_allocator *blka_new(void) { struct blk_allocator *new = malloc(sizeof(struct blk_allocator)); new->meta = NULL; return new; } struct blk_meta *blka_alloc(struct blk_allocator *blka, size_t size) { long page_size = sysconf(_SC_PAGESIZE); size_t aligned_size = align(size + sizeof(struct blk_meta), page_size); struct blk_meta *meta = mmap(NULL, aligned_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (meta == MAP_FAILED) return NULL; meta->size = aligned_size - sizeof(struct blk_meta); meta->next = blka->meta; blka->meta = meta; return meta; } void blka_free(struct blk_meta *blk) { munmap(blk, blk->size + sizeof(struct blk_meta)); } void blka_pop(struct blk_allocator *blka) { if (blka->meta == NULL) return; struct blk_meta *meta = blka->meta; blka->meta = blka->meta->next; blka_free(meta); } void blka_delete(struct blk_allocator *blka) { while (blka->meta) { blka_pop(blka); } free(blka); }