Home | History | Annotate | Download | only in lib
      1 #include <stdlib.h>
      2 #include <assert.h>
      3 #include <inttypes.h>
      4 
      5 #include "memalign.h"
      6 
      7 #define PTR_ALIGN(ptr, mask)   \
      8 	(char *)((uintptr_t)((ptr) + (mask)) & ~(mask))
      9 
     10 struct align_footer {
     11 	unsigned int offset;
     12 };
     13 
     14 void *fio_memalign(size_t alignment, size_t size)
     15 {
     16 	struct align_footer *f;
     17 	void *ptr, *ret = NULL;
     18 
     19 	assert(!(alignment & (alignment - 1)));
     20 
     21 	ptr = malloc(size + alignment + size + sizeof(*f) - 1);
     22 	if (ptr) {
     23 		ret = PTR_ALIGN(ptr, alignment - 1);
     24 		f = ret + size;
     25 		f->offset = (uintptr_t) ret - (uintptr_t) ptr;
     26 	}
     27 
     28 	return ret;
     29 }
     30 
     31 void fio_memfree(void *ptr, size_t size)
     32 {
     33 	struct align_footer *f = ptr + size;
     34 
     35 	free(ptr - f->offset);
     36 }
     37