From 1fd4ddd23ea21789a02dd0dfce940f0ab71ff72e Mon Sep 17 00:00:00 2001 From: Matthew Parkinson Date: Wed, 8 Jan 2020 15:18:55 +0000 Subject: [PATCH 1/2] 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 600c31927..72e0f3760 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)( From 5786ecc3cf0086d6a78ad325c00a1a60f538bc48 Mon Sep 17 00:00:00 2001 From: Matthew Parkinson Date: Wed, 8 Jan 2020 15:25:29 +0000 Subject: [PATCH 2/2] Made aligned_alloc produce aligned values. Previous implementation of aligned_alloc met the specification, but was not particularly useful. This uses the same implementation for alligned_alloc and memalign. --- src/override/malloc.cc | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/override/malloc.cc b/src/override/malloc.cc index 72e0f3760..6adce4e2f 100644 --- a/src/override/malloc.cc +++ b/src/override/malloc.cc @@ -104,14 +104,6 @@ extern "C" } #endif - SNMALLOC_EXPORT void* - SNMALLOC_NAME_MANGLE(aligned_alloc)(size_t alignment, size_t size) - { - assert((size % alignment) == 0); - (void)alignment; - 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 @@ -159,6 +151,13 @@ extern "C" return SNMALLOC_NAME_MANGLE(malloc)(aligned_size(alignment, size)); } + SNMALLOC_EXPORT void* + SNMALLOC_NAME_MANGLE(aligned_alloc)(size_t alignment, size_t size) + { + assert((size % alignment) == 0); + return SNMALLOC_NAME_MANGLE(memalign)(alignment, size); + } + SNMALLOC_EXPORT int SNMALLOC_NAME_MANGLE(posix_memalign)( void** memptr, size_t alignment, size_t size) {