diff --git a/src/snmalloc/backend/meta_protected_range.h b/src/snmalloc/backend/meta_protected_range.h index 5c5795c..b94968c 100644 --- a/src/snmalloc/backend/meta_protected_range.h +++ b/src/snmalloc/backend/meta_protected_range.h @@ -75,11 +75,14 @@ namespace snmalloc CommitRange, // In case of huge pages, we don't want to give each thread its own huge // page, so commit in the global range. - LargeBuddyRange< - max_page_chunk_size_bits, - max_page_chunk_size_bits, - Pagemap, - page_size_bits>, + std::conditional_t< + (max_page_chunk_size_bits > MIN_CHUNK_BITS), + LargeBuddyRange< + max_page_chunk_size_bits, + max_page_chunk_size_bits, + Pagemap, + page_size_bits>, + NopRange>, LogRange<4>, GlobalRange, StatsRange>; diff --git a/src/snmalloc/backend_helpers/backend_helpers.h b/src/snmalloc/backend_helpers/backend_helpers.h index 2104e68..24e02b0 100644 --- a/src/snmalloc/backend_helpers/backend_helpers.h +++ b/src/snmalloc/backend_helpers/backend_helpers.h @@ -9,6 +9,7 @@ #include "indirectrange.h" #include "largebuddyrange.h" #include "logrange.h" +#include "noprange.h" #include "pagemap.h" #include "pagemapregisterrange.h" #include "palrange.h" diff --git a/src/snmalloc/backend_helpers/buddy.h b/src/snmalloc/backend_helpers/buddy.h index 2d9f27b..c425021 100644 --- a/src/snmalloc/backend_helpers/buddy.h +++ b/src/snmalloc/backend_helpers/buddy.h @@ -15,6 +15,8 @@ namespace snmalloc template class Buddy { + static_assert(MAX_SIZE_BITS > MIN_SIZE_BITS); + struct Entry { typename Rep::Contents cache[3]; diff --git a/src/snmalloc/backend_helpers/noprange.h b/src/snmalloc/backend_helpers/noprange.h new file mode 100644 index 0000000..45dcfdc --- /dev/null +++ b/src/snmalloc/backend_helpers/noprange.h @@ -0,0 +1,36 @@ +#pragma once +#include "range_helpers.h" + +namespace snmalloc +{ + struct NopRange + { + template + class Type : public ContainsParent + { + using ContainsParent::parent; + + public: + static constexpr bool Aligned = ParentRange::Aligned; + + static constexpr bool ConcurrencySafe = ParentRange::ConcurrencySafe; + + using ChunkBounds = typename ParentRange::ChunkBounds; + static_assert( + ChunkBounds::address_space_control == + capptr::dimension::AddressSpaceControl::Full); + + constexpr Type() = default; + + CapPtr alloc_range(size_t size) + { + return parent.alloc_range(size); + } + + void dealloc_range(CapPtr base, size_t size) + { + parent.dealloc_range(base, size); + } + }; + }; +} // namespace snmalloc