#include <stdlib.h> | |
#include <assert.h> | |
#include <inttypes.h> | |
#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); | |
} |