diff --git a/src/snmalloc/mem/corealloc.h b/src/snmalloc/mem/corealloc.h index aa3fa3d..a6481b6 100644 --- a/src/snmalloc/mem/corealloc.h +++ b/src/snmalloc/mem/corealloc.h @@ -6,6 +6,7 @@ #include "pool.h" #include "remotecache.h" #include "sizeclasstable.h" +#include "snmalloc/stl/new.h" #include "ticker.h" namespace snmalloc @@ -1128,7 +1129,8 @@ namespace snmalloc capptr::Alloc spare_start = pointer_offset(raw, round_sizeof); Range r{spare_start, spare}; - auto p = capptr::Alloc::unsafe_from(new (raw.unsafe_ptr()) CA(r)); + auto p = capptr::Alloc::unsafe_from( + new (raw.unsafe_ptr(), placement_token) CA(r)); // Remove excess from the bounds. p = Aal::capptr_bound(p, round_sizeof); diff --git a/src/snmalloc/mem/freelist.h b/src/snmalloc/mem/freelist.h index b184c8c..07b47e6 100644 --- a/src/snmalloc/mem/freelist.h +++ b/src/snmalloc/mem/freelist.h @@ -35,6 +35,7 @@ #include "../ds/ds.h" #include "entropy.h" +#include "snmalloc/stl/new.h" #include @@ -265,7 +266,7 @@ namespace snmalloc static BHeadPtr make(CapPtr p) { return CapPtr, BView>::unsafe_from( - new (p.unsafe_ptr()) Object::T()); + new (p.unsafe_ptr(), placement_token) Object::T()); } /** diff --git a/src/snmalloc/mem/metadata.h b/src/snmalloc/mem/metadata.h index b363d6e..9821dc1 100644 --- a/src/snmalloc/mem/metadata.h +++ b/src/snmalloc/mem/metadata.h @@ -3,6 +3,7 @@ #include "../ds/ds.h" #include "freelist.h" #include "sizeclasstable.h" +#include "snmalloc/stl/new.h" namespace snmalloc { @@ -466,7 +467,7 @@ namespace snmalloc large_ = false; - new (&client_meta_) + new (&client_meta_, placement_token) typename ClientMeta::StorageType[get_client_storage_count(sizeclass)]; } @@ -486,7 +487,7 @@ namespace snmalloc // Jump to slow path on first deallocation. needed() = 1; - new (&client_meta_) typename ClientMeta::StorageType(); + new (&client_meta_, placement_token) typename ClientMeta::StorageType(); } /** diff --git a/src/snmalloc/mem/pool.h b/src/snmalloc/mem/pool.h index 0497d1a..9b6294d 100644 --- a/src/snmalloc/mem/pool.h +++ b/src/snmalloc/mem/pool.h @@ -3,8 +3,6 @@ #include "../ds/ds.h" #include "pooled.h" -#include - namespace snmalloc { /** diff --git a/src/snmalloc/mem/remoteallocator.h b/src/snmalloc/mem/remoteallocator.h index 58c62e4..193d753 100644 --- a/src/snmalloc/mem/remoteallocator.h +++ b/src/snmalloc/mem/remoteallocator.h @@ -1,8 +1,7 @@ #pragma once #include "freelist_queue.h" - -#include +#include "snmalloc/stl/new.h" namespace snmalloc { @@ -43,7 +42,7 @@ namespace snmalloc static auto emplace_in_alloc(capptr::Alloc alloc) { return CapPtr::unsafe_from( - new (alloc.unsafe_ptr()) BatchedRemoteMessage()); + new (alloc.unsafe_ptr(), placement_token) BatchedRemoteMessage()); } static auto mk_from_freelist_builder( @@ -67,7 +66,7 @@ namespace snmalloc auto last_prev = last->prev; auto self = CapPtr::unsafe_from( - new (last.unsafe_ptr()) BatchedRemoteMessage()); + new (last.unsafe_ptr(), placement_token) BatchedRemoteMessage()); self->free_ring.prev = last_prev; // XXX On CHERI, we could do a fair bit better if we had a primitive for @@ -222,7 +221,7 @@ namespace snmalloc static auto emplace_in_alloc(capptr::Alloc alloc) { return CapPtr::unsafe_from( - new (alloc.unsafe_ptr()) SingletonRemoteMessage()); + new (alloc.unsafe_ptr(), placement_token) SingletonRemoteMessage()); } static freelist::HeadPtr diff --git a/src/snmalloc/stl/new.h b/src/snmalloc/stl/new.h new file mode 100644 index 0000000..421efad --- /dev/null +++ b/src/snmalloc/stl/new.h @@ -0,0 +1,35 @@ +#pragma once + +#include "snmalloc/ds_core/defines.h" + +namespace snmalloc +{ + + // This is used in both vendored and non-vendored mode. + struct PlacementToken + {}; + + inline constexpr PlacementToken placement_token{}; +} // namespace snmalloc + +SNMALLOC_FAST_PATH_INLINE void* +operator new(size_t, void* ptr, snmalloc::PlacementToken) noexcept +{ + return ptr; +} + +SNMALLOC_FAST_PATH_INLINE void* +operator new[](size_t, void* ptr, snmalloc::PlacementToken) noexcept +{ + return ptr; +} + +// The following is not really needed, but windows expects that new/delete +// definitions are paired. +SNMALLOC_FAST_PATH_INLINE void +operator delete(void*, void*, snmalloc::PlacementToken) noexcept +{} + +SNMALLOC_FAST_PATH_INLINE void +operator delete[](void*, void*, snmalloc::PlacementToken) noexcept +{}