Commit | Line | Data |
---|---|---|
91aea6ec JA |
1 | #include <stdlib.h> |
2 | #include <assert.h> | |
e43606c2 | 3 | #include <inttypes.h> |
91aea6ec JA |
4 | |
5 | #include "memalign.h" | |
248c9436 | 6 | #include "../fio.h" |
91aea6ec JA |
7 | |
8 | struct align_footer { | |
9 | unsigned int offset; | |
10 | }; | |
11 | ||
91aea6ec JA |
12 | void *fio_memalign(size_t alignment, size_t size) |
13 | { | |
14 | struct align_footer *f; | |
15 | void *ptr, *ret = NULL; | |
16 | ||
17 | assert(!(alignment & (alignment - 1))); | |
18 | ||
19 | ptr = malloc(size + alignment + size + sizeof(*f) - 1); | |
20 | if (ptr) { | |
5fb55c77 | 21 | ret = PTR_ALIGN(ptr, alignment - 1); |
91aea6ec | 22 | f = ret + size; |
e43606c2 | 23 | f->offset = (uintptr_t) ret - (uintptr_t) ptr; |
91aea6ec JA |
24 | } |
25 | ||
26 | return ret; | |
27 | } | |
28 | ||
29 | void fio_memfree(void *ptr, size_t size) | |
30 | { | |
31 | struct align_footer *f = ptr + size; | |
32 | ||
33 | free(ptr - f->offset); | |
34 | } |