From 20e804728b0da165c7ab8d7f2af959e66d4730c2 Mon Sep 17 00:00:00 2001 From: Nathaniel Filardo Date: Tue, 12 Nov 2019 15:12:48 +0000 Subject: [PATCH] Move bits::is_aligned_block to address.h And chase consequences --- src/ds/address.h | 17 +++++++++++++++++ src/ds/bits.h | 10 ---------- src/mem/alloc.h | 2 +- src/mem/mediumslab.h | 2 +- src/pal/pal_apple.h | 4 ++-- src/pal/pal_bsd.h | 2 +- src/pal/pal_linux.h | 4 ++-- src/pal/pal_posix.h | 11 +++++------ src/pal/pal_windows.h | 10 +++++----- 9 files changed, 34 insertions(+), 28 deletions(-) diff --git a/src/ds/address.h b/src/ds/address.h index e72663c..34c8aa9 100644 --- a/src/ds/address.h +++ b/src/ds/address.h @@ -1,4 +1,7 @@ #pragma once +#include "bits.h" + +#include #include namespace snmalloc @@ -39,4 +42,18 @@ namespace snmalloc { return reinterpret_cast(address); } + + /** + * Test if a pointer is aligned to a given size, which must be a power of + * two. + */ + template + static inline bool is_aligned_block(void* p, size_t size) + { + static_assert(bits::next_pow2_const(alignment) == alignment); + + return ((static_cast(address_cast(p)) | size) & (alignment - 1)) == + 0; + } + } // namespace snmalloc diff --git a/src/ds/bits.h b/src/ds/bits.h index 420c3b4..2f55aad 100644 --- a/src/ds/bits.h +++ b/src/ds/bits.h @@ -6,7 +6,6 @@ // #define USE_LZCNT #include "../aal/aal.h" -#include "address.h" #include "defines.h" #include @@ -240,15 +239,6 @@ namespace snmalloc return value; } - template - static inline bool is_aligned_block(void* p, size_t size) - { - assert(next_pow2(alignment) == alignment); - - return ((static_cast(address_cast(p)) | size) & - (alignment - 1)) == 0; - } - /************************************************ * * Map large range of strictly positive integers diff --git a/src/mem/alloc.h b/src/mem/alloc.h index 14e35e7..84c5460 100644 --- a/src/mem/alloc.h +++ b/src/mem/alloc.h @@ -682,7 +682,7 @@ namespace snmalloc // All medium size classes are page aligned. if (i > NUM_SMALL_CLASSES) { - assert(bits::is_aligned_block(nullptr, size1)); + assert(is_aligned_block(nullptr, size1)); } assert(sc1 == i); diff --git a/src/mem/mediumslab.h b/src/mem/mediumslab.h index 38042ad..ed5928e 100644 --- a/src/mem/mediumslab.h +++ b/src/mem/mediumslab.h @@ -84,7 +84,7 @@ namespace snmalloc void* p = pointer_offset(this, (static_cast(index) << 8)); free--; - assert(bits::is_aligned_block(p, OS_PAGE_SIZE)); + assert(is_aligned_block(p, OS_PAGE_SIZE)); size = bits::align_up(size, OS_PAGE_SIZE); if constexpr (decommit_strategy == DecommitAll) diff --git a/src/pal/pal_apple.h b/src/pal/pal_apple.h index 72c3feb..87c3eb8 100644 --- a/src/pal/pal_apple.h +++ b/src/pal/pal_apple.h @@ -32,9 +32,9 @@ namespace snmalloc template void zero(void* p, size_t size) { - if (page_aligned || bits::is_aligned_block(p, size)) + if (page_aligned || is_aligned_block(p, size)) { - assert(bits::is_aligned_block(p, size)); + assert(is_aligned_block(p, size)); void* r = mmap( p, size, diff --git a/src/pal/pal_bsd.h b/src/pal/pal_bsd.h index f373825..7252c86 100644 --- a/src/pal/pal_bsd.h +++ b/src/pal/pal_bsd.h @@ -33,7 +33,7 @@ namespace snmalloc */ void notify_not_using(void* p, size_t size) noexcept { - assert(bits::is_aligned_block(p, size)); + assert(is_aligned_block(p, size)); madvise(p, size, MADV_FREE); } }; diff --git a/src/pal/pal_linux.h b/src/pal/pal_linux.h index e159831..f979943 100644 --- a/src/pal/pal_linux.h +++ b/src/pal/pal_linux.h @@ -37,9 +37,9 @@ namespace snmalloc template void zero(void* p, size_t size) noexcept { - if (page_aligned || bits::is_aligned_block(p, size)) + if (page_aligned || is_aligned_block(p, size)) { - assert(bits::is_aligned_block(p, size)); + assert(is_aligned_block(p, size)); madvise(p, size, MADV_DONTNEED); } else diff --git a/src/pal/pal_posix.h b/src/pal/pal_posix.h index 1e909bb..b484cf5 100644 --- a/src/pal/pal_posix.h +++ b/src/pal/pal_posix.h @@ -1,6 +1,6 @@ #pragma once -#include "../ds/bits.h" +#include "../ds/address.h" #include "../mem/allocconfig.h" #include @@ -53,7 +53,7 @@ namespace snmalloc */ void notify_not_using(void* p, size_t size) noexcept { - assert(bits::is_aligned_block(p, size)); + assert(is_aligned_block(p, size)); UNUSED(p); UNUSED(size); } @@ -68,8 +68,7 @@ namespace snmalloc template void notify_using(void* p, size_t size) noexcept { - assert( - bits::is_aligned_block(p, size) || (zero_mem == NoZero)); + assert(is_aligned_block(p, size) || (zero_mem == NoZero)); if constexpr (zero_mem == YesZero) static_cast(this)->template zero(p, size); @@ -94,9 +93,9 @@ namespace snmalloc template void zero(void* p, size_t size) noexcept { - if (page_aligned || bits::is_aligned_block(p, size)) + if (page_aligned || is_aligned_block(p, size)) { - assert(bits::is_aligned_block(p, size)); + assert(is_aligned_block(p, size)); void* r = mmap( p, size, diff --git a/src/pal/pal_windows.h b/src/pal/pal_windows.h index 12f21eb..8056502 100644 --- a/src/pal/pal_windows.h +++ b/src/pal/pal_windows.h @@ -1,5 +1,6 @@ #pragma once +#include "../ds/address.h" #include "../ds/bits.h" #include "../mem/allocconfig.h" @@ -107,7 +108,7 @@ namespace snmalloc /// Notify platform that we will not be using these pages void notify_not_using(void* p, size_t size) noexcept { - assert(bits::is_aligned_block(p, size)); + assert(is_aligned_block(p, size)); BOOL ok = VirtualFree(p, size, MEM_DECOMMIT); @@ -119,8 +120,7 @@ namespace snmalloc template void notify_using(void* p, size_t size) noexcept { - assert( - bits::is_aligned_block(p, size) || (zero_mem == NoZero)); + assert(is_aligned_block(p, size) || (zero_mem == NoZero)); void* r = VirtualAlloc(p, size, MEM_COMMIT, PAGE_READWRITE); @@ -132,9 +132,9 @@ namespace snmalloc template void zero(void* p, size_t size) noexcept { - if (page_aligned || bits::is_aligned_block(p, size)) + if (page_aligned || is_aligned_block(p, size)) { - assert(bits::is_aligned_block(p, size)); + assert(is_aligned_block(p, size)); notify_not_using(p, size); notify_using(p, size); }