Free queues hold Wild pointers

This commit is contained in:
Nathaniel Wesley Filardo
2021-09-15 00:19:39 +01:00
committed by Nathaniel Wesley Filardo
parent 7750676598
commit d4c120dfe5
4 changed files with 109 additions and 81 deletions

View File

@@ -12,9 +12,9 @@ namespace snmalloc
{
using Stats = AllocStats<NUM_SIZECLASSES, NUM_LARGE_CLASSES>;
template<SNMALLOC_CONCEPT(capptr::ConceptBound) BQueue>
inline static SNMALLOC_FAST_PATH void* finish_alloc_no_zero(
FreeObject::HeadPtr<capptr::bounds::Alloc, capptr::bounds::Alloc> p,
sizeclass_t sizeclass)
FreeObject::HeadPtr<capptr::bounds::Alloc, BQueue> p, sizeclass_t sizeclass)
{
SNMALLOC_ASSERT(Metaslab::is_start_of_object(sizeclass, address_cast(p)));
UNUSED(sizeclass);
@@ -24,10 +24,12 @@ namespace snmalloc
return r;
}
template<ZeroMem zero_mem, typename SharedStateHandle>
template<
ZeroMem zero_mem,
typename SharedStateHandle,
SNMALLOC_CONCEPT(capptr::ConceptBound) BQueue>
inline static SNMALLOC_FAST_PATH void* finish_alloc(
FreeObject::HeadPtr<capptr::bounds::Alloc, capptr::bounds::Alloc> p,
sizeclass_t sizeclass)
FreeObject::HeadPtr<capptr::bounds::Alloc, BQueue> p, sizeclass_t sizeclass)
{
auto r = finish_alloc_no_zero(p, sizeclass);
@@ -48,7 +50,7 @@ namespace snmalloc
// Free list per small size class. These are used for
// allocation on the fast path. This part of the code is inspired by
// mimalloc.
FreeListIter<capptr::bounds::Alloc, capptr::bounds::Alloc>
FreeListIter<capptr::bounds::Alloc, capptr::bounds::AllocWild>
small_fast_free_lists[NUM_SIZECLASSES];
// This is the entropy for a particular thread.
@@ -82,8 +84,11 @@ namespace snmalloc
typename SharedStateHandle::LocalState* local_state, DeallocFun dealloc)
{
auto& key = entropy.get_free_list_key();
auto domesticate = [](FreeObject::QueuePtr<capptr::bounds::Alloc> p)
SNMALLOC_FAST_PATH_LAMBDA { return p; };
auto domesticate =
[local_state](FreeObject::QueuePtr<capptr::bounds::AllocWild> p)
SNMALLOC_FAST_PATH_LAMBDA {
return capptr_domesticate<SharedStateHandle>(local_state, p);
};
for (size_t i = 0; i < NUM_SIZECLASSES; i++)
{