From c9da18a14529868ce180f6f2973035220fd7e3a1 Mon Sep 17 00:00:00 2001 From: Matthew Parkinson Date: Thu, 6 Feb 2020 13:05:40 +0000 Subject: [PATCH] Improve Debug test speed. Removed some very expensive debug checks off the fast path of deallocation. --- src/ds/address.h | 2 +- src/ds/bits.h | 6 +++--- src/mem/slab.h | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/ds/address.h b/src/ds/address.h index 4b61e50..ae98de3 100644 --- a/src/ds/address.h +++ b/src/ds/address.h @@ -61,7 +61,7 @@ namespace snmalloc * power of two. */ template - inline T* pointer_align_down(void* p) + SNMALLOC_FAST_PATH T* pointer_align_down(void* p) { static_assert(alignment > 0); static_assert(bits::next_pow2_const(alignment) == alignment); diff --git a/src/ds/bits.h b/src/ds/bits.h index 91920d1..374dccd 100644 --- a/src/ds/bits.h +++ b/src/ds/bits.h @@ -54,7 +54,7 @@ namespace snmalloc static constexpr size_t ADDRESS_BITS = is64() ? 48 : 32; - inline size_t clz(size_t x) + SNMALLOC_FAST_PATH size_t clz(size_t x) { #if defined(_MSC_VER) # ifdef USE_LZCNT @@ -193,7 +193,7 @@ namespace snmalloc #endif } - inline size_t next_pow2(size_t x) + SNMALLOC_FAST_PATH size_t next_pow2(size_t x) { // Correct for numbers [0..MAX_SIZE >> 1). // Returns 1 for x > (MAX_SIZE >> 1). @@ -223,7 +223,7 @@ namespace snmalloc return BITS - clz_const(x - 1); } - static inline size_t align_down(size_t value, size_t alignment) + static SNMALLOC_FAST_PATH size_t align_down(size_t value, size_t alignment) { assert(next_pow2(alignment) == alignment); diff --git a/src/mem/slab.h b/src/mem/slab.h index 00058ae..9fa2137 100644 --- a/src/mem/slab.h +++ b/src/mem/slab.h @@ -45,6 +45,7 @@ namespace snmalloc assert(rsize == sizeclass_to_size(meta.sizeclass)); assert(sl.get_head() == (SlabLink*)pointer_offset(this, meta.link)); assert(!meta.is_full()); + meta.debug_slab_invariant(this); void* p = nullptr; bool p_has_value = false; @@ -156,7 +157,6 @@ namespace snmalloc if (meta.is_unused()) error("Detected potential double free."); #endif - meta.debug_slab_invariant(this); if (unlikely(meta.return_object())) return false; @@ -170,7 +170,7 @@ namespace snmalloc // Set the next pointer to the previous head. Metaslab::store_next(p, head); - meta.debug_slab_invariant(this); + return true; } @@ -182,6 +182,7 @@ namespace snmalloc dealloc_slow(SlabList* sl, Superslab* super, void* p) { Metaslab& meta = super->get_meta(this); + meta.debug_slab_invariant(this); if (meta.is_full()) {