diff --git a/src/mem/metaslab.h b/src/mem/metaslab.h index f364ce6..f96ff76 100644 --- a/src/mem/metaslab.h +++ b/src/mem/metaslab.h @@ -33,7 +33,7 @@ namespace snmalloc /** * Pointer to first free entry in this slab * - * The list will (allocated - needed - 1) long. The -1 is + * The list will be (allocated - needed - 1) long. The -1 is * for the `link` element which is not in the free list. */ void* head; @@ -145,6 +145,11 @@ namespace snmalloc return pointer_cast(address_cast(p) & SLAB_MASK); } + static bool is_short(Slab* p) + { + return (address_cast(p) & SUPERSLAB_MASK) == address_cast(p); + } + /** * Check bump-free-list-segment for cycles * @@ -187,9 +192,11 @@ namespace snmalloc #endif } - void debug_slab_invariant(bool is_short, Slab* slab) + void debug_slab_invariant(Slab* slab) { #if !defined(NDEBUG) && !defined(SNMALLOC_CHEAP_CHECKS) + bool is_short = Metaslab::is_short(slab); + if (is_full()) { // There is no free list to validate @@ -252,7 +259,6 @@ namespace snmalloc assert(SLAB_SIZE == accounted_for); #else UNUSED(slab); - UNUSED(is_short); #endif } }; diff --git a/src/mem/slab.h b/src/mem/slab.h index 4606a87..9234aa5 100644 --- a/src/mem/slab.h +++ b/src/mem/slab.h @@ -43,7 +43,7 @@ namespace snmalloc void* head = meta.head; assert(rsize == sizeclass_to_size(meta.sizeclass)); - meta.debug_slab_invariant(is_short(), this); + meta.debug_slab_invariant(this); assert(sl.get_head() == (SlabLink*)((size_t)this + meta.link)); assert(!meta.is_full()); @@ -127,7 +127,7 @@ namespace snmalloc assert(is_start_of_object(Superslab::get(p), p)); - meta.debug_slab_invariant(is_short(), this); + meta.debug_slab_invariant(this); if constexpr (zero_mem == YesZero) { @@ -158,7 +158,7 @@ namespace snmalloc if (meta.is_unused()) error("Detected potential double free."); #endif - meta.debug_slab_invariant(is_short(), this); + meta.debug_slab_invariant(this); if (unlikely(meta.return_object())) return false; @@ -172,7 +172,7 @@ namespace snmalloc // Set the next pointer to the previous head. Metaslab::store_next(p, head); - meta.debug_slab_invariant(is_short(), this); + meta.debug_slab_invariant(this); return true; } @@ -206,7 +206,7 @@ namespace snmalloc // Push on the list of slabs for this sizeclass. sl->insert_back(meta.get_link(this)); - meta.debug_slab_invariant(is_short(), this); + meta.debug_slab_invariant(this); return Superslab::NoSlabReturn; } @@ -218,10 +218,9 @@ namespace snmalloc return super->dealloc_slab(this, memory_provider); } - bool is_short() { - return (address_cast(this) & SUPERSLAB_MASK) == address_cast(this); + return Metaslab::is_short(this); } }; } // namespace snmalloc