36 lines
665 B
C
36 lines
665 B
C
#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);
|
|
}
|