diff --git a/src/snmalloc/backend/backend.h b/src/snmalloc/backend/backend.h index ae39ca1..cb399aa 100644 --- a/src/snmalloc/backend/backend.h +++ b/src/snmalloc/backend/backend.h @@ -84,7 +84,7 @@ namespace snmalloc return {nullptr, nullptr}; } - auto p = local_state.object_range.alloc_range(size); + auto p = local_state.get_object_range()->alloc_range(size); #ifdef SNMALLOC_TRACING message<1024>("Alloc chunk: {} ({})", p.unsafe_ptr(), size); @@ -146,7 +146,7 @@ namespace snmalloc // the chunk. On CHERI platforms this will need to be stored in the // SlabMetadata or similar. auto chunk = capptr::Chunk::unsafe_from(alloc.unsafe_ptr()); - local_state.object_range.dealloc_range(chunk, size); + local_state.get_object_range()->dealloc_range(chunk, size); } template diff --git a/src/snmalloc/backend/meta_protected_range.h b/src/snmalloc/backend/meta_protected_range.h index 46cdbc5..5c5795c 100644 --- a/src/snmalloc/backend/meta_protected_range.h +++ b/src/snmalloc/backend/meta_protected_range.h @@ -103,13 +103,18 @@ namespace snmalloc Pagemap>, SmallBuddyRange>; - public: - using Stats = StatsCombiner; - ObjectRange object_range; MetaRange meta_range; + public: + using Stats = StatsCombiner; + + ObjectRange* get_object_range() + { + return &object_range; + } + MetaRange& get_meta_range() { return meta_range; diff --git a/src/snmalloc/backend/standard_range.h b/src/snmalloc/backend/standard_range.h index b9a2d5b..225a9a3 100644 --- a/src/snmalloc/backend/standard_range.h +++ b/src/snmalloc/backend/standard_range.h @@ -44,23 +44,31 @@ namespace snmalloc static constexpr size_t page_size_bits = bits::next_pow2_bits_const(PAL::page_size); + public: // Source for object allocations and metadata // Use buddy allocators to cache locally. - using ObjectRange = Pipe< + using LargeObjectRange = Pipe< Stats, LargeBuddyRange< LocalCacheSizeBits, LocalCacheSizeBits, Pagemap, - page_size_bits>, - SmallBuddyRange>; + page_size_bits>>; + + private: + using ObjectRange = Pipe; + + ObjectRange object_range; public: // Expose a global range for the initial allocation of meta-data. using GlobalMetaRange = Pipe; // Where we get user allocations from. - ObjectRange object_range; + LargeObjectRange* get_object_range() + { + return object_range.template ancestor(); + } // Where we get meta-data allocations from. ObjectRange& get_meta_range()