| #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); |
| 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); |
| } |