#include <stdlib.h> #include <assert.h> #include <inttypes.h> #include "memalign.h" struct align_footer { unsigned int offset; }; #define PTR_ALIGN(ptr, mask) \ (char *) (((uintptr_t) ((ptr) + (mask)) & ~(mask))) 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); }