in src/mem/corealloc.h [775:824]
SNMALLOC_SLOW_PATH capptr::Alloc<void> small_alloc_slow(
smallsizeclass_t sizeclass, freelist::Iter<>& fast_free_list)
{
size_t rsize = sizeclass_to_size(sizeclass);
// No existing free list get a new slab.
size_t slab_size = sizeclass_to_slab_size(sizeclass);
size_t slab_sizeclass = sizeclass_to_slab_sizeclass(sizeclass);
#ifdef SNMALLOC_TRACING
std::cout << "rsize " << rsize << std::endl;
std::cout << "slab size " << slab_size << std::endl;
#endif
auto [slab, meta] =
snmalloc::ChunkAllocator::alloc_chunk<SharedStateHandle>(
get_backend_local_state(),
chunk_local_state,
sizeclass_t::from_small_class(sizeclass),
slab_sizeclass,
slab_size,
public_state());
if (slab == nullptr)
{
return nullptr;
}
// Set meta slab to empty.
meta->initialise(sizeclass);
// Build a free list for the slab
alloc_new_list(slab, meta, rsize, slab_size, entropy);
auto domesticate =
[this](freelist::QueuePtr p) SNMALLOC_FAST_PATH_LAMBDA {
return capptr_domesticate<SharedStateHandle>(backend_state_ptr(), p);
};
auto [p, still_active] = Metaslab::alloc_free_list(
domesticate, meta, fast_free_list, entropy, sizeclass);
if (still_active)
{
alloc_classes[sizeclass].length++;
alloc_classes[sizeclass].available.insert(meta);
}
auto r = finish_alloc<zero_mem, SharedStateHandle>(p, sizeclass);
return ticker.check_tick(r);
}