diff --git a/common/common_defs.h b/common/common_defs.h index 41e9feb..d4c2604 100644 --- a/common/common_defs.h +++ b/common/common_defs.h @@ -140,6 +140,7 @@ typedef size_t machine_word_t; #define MAX(a, b) ((a) >= (b) ? (a) : (b)) #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) #define STATIC_ASSERT(expr) ((void)sizeof(char[1 - 2 * !(expr)])) +#define ALIGN(n, a) (((n) + (a) - 1) & ~((a) - 1)) /* ========================================================================== */ /* Endianness handling */ diff --git a/lib/aligned_malloc.c b/lib/aligned_malloc.c index a852fdc..d00af19 100644 --- a/lib/aligned_malloc.c +++ b/lib/aligned_malloc.c @@ -25,15 +25,11 @@ void * aligned_malloc(size_t alignment, size_t size) { - const uintptr_t mask = alignment - 1; - char *ptr = NULL; - char *raw_ptr; - - raw_ptr = malloc(mask + sizeof(size_t) + size); - if (raw_ptr) { - ptr = (char *)raw_ptr + sizeof(size_t); - ptr = (void *)(((uintptr_t)ptr + mask) & ~mask); - *((size_t *)ptr - 1) = ptr - raw_ptr; + void *ptr = malloc(sizeof(void *) + alignment - 1 + size); + if (ptr) { + void *orig_ptr = ptr; + ptr = (void *)ALIGN((uintptr_t)ptr + sizeof(void *), alignment); + ((void **)ptr)[-1] = orig_ptr; } return ptr; } @@ -42,5 +38,5 @@ void aligned_free(void *ptr) { if (ptr) - free((char *)ptr - *((size_t *)ptr - 1)); + free(((void **)ptr)[-1]); }