diff --git a/include/mimalloc-internal.h b/include/mimalloc-internal.h index de77f3b5..fd97b3ef 100644 --- a/include/mimalloc-internal.h +++ b/include/mimalloc-internal.h @@ -167,10 +167,12 @@ static inline bool mi_mul_overflow(size_t count, size_t size, size_t* total) { #endif } -// Align upwards -static inline uintptr_t _mi_is_power_of_two(uintptr_t x) { +// Is `x` a power of two? +static inline bool _mi_is_power_of_two(uintptr_t x) { return ((x & (x - 1)) == 0); } + +// Align upwards static inline uintptr_t _mi_align_up(uintptr_t sz, size_t alignment) { uintptr_t mask = alignment - 1; if ((alignment & mask) == 0) { // power of two? diff --git a/src/alloc-posix.c b/src/alloc-posix.c index f51aa999..f64cb1f6 100644 --- a/src/alloc-posix.c +++ b/src/alloc-posix.c @@ -48,7 +48,7 @@ int mi_posix_memalign(void** p, size_t alignment, size_t size) mi_attr_noexcept // if (p == NULL) return EINVAL; if (alignment % sizeof(void*) != 0) return EINVAL; // natural alignment - if ((alignment & (alignment - 1)) != 0) return EINVAL; // not a power of 2 + if (!_mi_is_power_of_two(alignment)) return EINVAL; // not a power of 2 void* q = mi_malloc_aligned(size, alignment); if (q==NULL && size != 0) return ENOMEM; *p = q;