#include #include #include #include "memalign.h" #define PTR_ALIGN(ptr, mask) \ (char *)((uintptr_t)((ptr) + (mask)) & ~(mask)) struct align_footer { unsigned int offset; }; void *fio_memalign(size_t alignment, size_t size) { struct align_footer *f; void *ptr, *ret = NULL; assert(!(alignment & (alignment - 1))); ptr = malloc(size + alignment + size + sizeof(*f) - 1); if (ptr) { ret = PTR_ALIGN(ptr, alignment - 1); f = ret + size; f->offset = (uintptr_t) ret - (uintptr_t) ptr; } return ret; } void fio_memfree(void *ptr, size_t size) { struct align_footer *f = ptr + size; free(ptr - f->offset); }