From 1fd4ddd23ea21789a02dd0dfce940f0ab71ff72e Mon Sep 17 00:00:00 2001 From: Matthew Parkinson Date: Wed, 8 Jan 2020 15:18:55 +0000 Subject: [PATCH] Factor alignment code, so it can be reused. --- src/override/malloc.cc | 45 +++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/src/override/malloc.cc b/src/override/malloc.cc index 600c319..72e0f37 100644 --- a/src/override/malloc.cc +++ b/src/override/malloc.cc @@ -112,6 +112,34 @@ extern "C" return SNMALLOC_NAME_MANGLE(malloc)(size); } + inline size_t aligned_size(size_t alignment, size_t size) + { + // Client responsible for checking alignment is not zero + assert(alignment != 0); + // Client responsible for checking alignment is not above SUPERSLAB_SIZE + assert(alignment <= SUPERSLAB_SIZE); + // Client responsible for checking alignment is a power of two + assert(bits::next_pow2(alignment) == alignment); + + size = bits::max(size, alignment); + snmalloc::sizeclass_t sc = size_to_sizeclass(size); + if (sc >= NUM_SIZECLASSES) + { + // large allocs are 16M aligned, which is maximum we guarantee + return size; + } + for (; sc < NUM_SIZECLASSES; sc++) + { + size = sizeclass_to_size(sc); + if ((size & (~size + 1)) >= alignment) + { + return size; + } + } + // Give max alignment. + return SUPERSLAB_SIZE; + } + SNMALLOC_EXPORT void* SNMALLOC_NAME_MANGLE(memalign)(size_t alignment, size_t size) { @@ -128,22 +156,7 @@ extern "C" return nullptr; } - size = bits::max(size, alignment); - snmalloc::sizeclass_t sc = size_to_sizeclass(size); - if (sc >= NUM_SIZECLASSES) - { - // large allocs are 16M aligned. - return SNMALLOC_NAME_MANGLE(malloc)(size); - } - for (; sc < NUM_SIZECLASSES; sc++) - { - size = sizeclass_to_size(sc); - if ((size & (~size + 1)) >= alignment) - { - return SNMALLOC_NAME_MANGLE(aligned_alloc)(alignment, size); - } - } - return SNMALLOC_NAME_MANGLE(malloc)(SUPERSLAB_SIZE); + return SNMALLOC_NAME_MANGLE(malloc)(aligned_size(alignment, size)); } SNMALLOC_EXPORT int SNMALLOC_NAME_MANGLE(posix_memalign)(