From f0b7dc4b04e9f0837d3ee7b9b4d97d5db2952684 Mon Sep 17 00:00:00 2001 From: Nathaniel Wesley Filardo Date: Sun, 17 Oct 2021 16:27:29 +0100 Subject: [PATCH] NFC: Extract MetaCommon from ChunkRecord --- src/mem/corealloc.h | 3 ++- src/mem/localalloc.h | 3 ++- src/mem/metaslab.h | 5 +++++ src/mem/slaballocator.h | 12 ++++++++---- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/mem/corealloc.h b/src/mem/corealloc.h index 87d4434..98c80a8 100644 --- a/src/mem/corealloc.h +++ b/src/mem/corealloc.h @@ -322,7 +322,8 @@ namespace snmalloc auto start_of_slab = pointer_align_down( p, snmalloc::sizeclass_to_slab_size(sizeclass)); // TODO Add bounds correctly here - chunk_record->chunk = capptr::Chunk(start_of_slab.unsafe_ptr()); + chunk_record->meta_common.chunk = + capptr::Chunk(start_of_slab.unsafe_ptr()); #ifdef SNMALLOC_TRACING std::cout << "Slab " << start_of_slab.unsafe_ptr() diff --git a/src/mem/localalloc.h b/src/mem/localalloc.h index a39eb04..cee763f 100644 --- a/src/mem/localalloc.h +++ b/src/mem/localalloc.h @@ -541,7 +541,8 @@ namespace snmalloc * a CapPtr to this region internally even while it's * allocated. */ - slab_record->chunk = capptr::Chunk(p_tame.unsafe_ptr()); + slab_record->meta_common.chunk = + capptr::Chunk(p_tame.unsafe_ptr()); check_init( []( CoreAlloc* core_alloc, diff --git a/src/mem/metaslab.h b/src/mem/metaslab.h index ce9d610..6527b43 100644 --- a/src/mem/metaslab.h +++ b/src/mem/metaslab.h @@ -9,6 +9,11 @@ namespace snmalloc { + struct MetaCommon + { + capptr::Chunk chunk; + }; + // The Metaslab represent the status of a single slab. // This can be either a short or a standard slab. class alignas(CACHELINE_SIZE) Metaslab diff --git a/src/mem/slaballocator.h b/src/mem/slaballocator.h index aa4d47f..92a9a1c 100644 --- a/src/mem/slaballocator.h +++ b/src/mem/slaballocator.h @@ -17,9 +17,13 @@ namespace snmalloc */ struct ChunkRecord { + MetaCommon meta_common; std::atomic next; - capptr::Chunk chunk; }; + static_assert(std::is_standard_layout_v); + static_assert( + offsetof(ChunkRecord, meta_common) == 0, + "ChunkRecord and Metaslab must share a common prefix"); /** * How many slab sizes that can be provided. @@ -97,7 +101,7 @@ namespace snmalloc if (chunk_record != nullptr) { - auto slab = chunk_record->chunk; + auto slab = chunk_record->meta_common.chunk; state.memory_in_stacks -= slab_size; auto meta = reinterpret_cast(chunk_record); #ifdef SNMALLOC_TRACING @@ -138,8 +142,8 @@ namespace snmalloc { auto& state = SharedStateHandle::get_slab_allocator_state(&local_state); #ifdef SNMALLOC_TRACING - std::cout << "Return slab:" << p->chunk.unsafe_ptr() << " slab_sizeclass " - << slab_sizeclass << " size " + std::cout << "Return slab:" << p->meta_common.chunk.unsafe_ptr() + << " slab_sizeclass " << slab_sizeclass << " size " << slab_sizeclass_to_size(slab_sizeclass) << " memory in stacks " << state.memory_in_stacks << std::endl; #endif