aligned_malloc: store pointer directly

This commit is contained in:
Eric Biggers 2016-08-27 23:38:59 -07:00
parent 18b149f52e
commit e603f7868d
2 changed files with 7 additions and 10 deletions

View File

@ -140,6 +140,7 @@ typedef size_t machine_word_t;
#define MAX(a, b) ((a) >= (b) ? (a) : (b)) #define MAX(a, b) ((a) >= (b) ? (a) : (b))
#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
#define STATIC_ASSERT(expr) ((void)sizeof(char[1 - 2 * !(expr)])) #define STATIC_ASSERT(expr) ((void)sizeof(char[1 - 2 * !(expr)]))
#define ALIGN(n, a) (((n) + (a) - 1) & ~((a) - 1))
/* ========================================================================== */ /* ========================================================================== */
/* Endianness handling */ /* Endianness handling */

View File

@ -25,15 +25,11 @@
void * void *
aligned_malloc(size_t alignment, size_t size) aligned_malloc(size_t alignment, size_t size)
{ {
const uintptr_t mask = alignment - 1; void *ptr = malloc(sizeof(void *) + alignment - 1 + size);
char *ptr = NULL; if (ptr) {
char *raw_ptr; void *orig_ptr = ptr;
ptr = (void *)ALIGN((uintptr_t)ptr + sizeof(void *), alignment);
raw_ptr = malloc(mask + sizeof(size_t) + size); ((void **)ptr)[-1] = orig_ptr;
if (raw_ptr) {
ptr = (char *)raw_ptr + sizeof(size_t);
ptr = (void *)(((uintptr_t)ptr + mask) & ~mask);
*((size_t *)ptr - 1) = ptr - raw_ptr;
} }
return ptr; return ptr;
} }
@ -42,5 +38,5 @@ void
aligned_free(void *ptr) aligned_free(void *ptr)
{ {
if (ptr) if (ptr)
free((char *)ptr - *((size_t *)ptr - 1)); free(((void **)ptr)[-1]);
} }