Randomise slab allocation pattern (#304)

The slab allocation pattern is randomised based on the deallocation
pattern.  This achieved by using two queues to enqueue free elements
onto.  We pick "randomly", which queue to add to, and then when we take
the free_queue to use, we splice the two queues together.
This commit is contained in:
Matthew Parkinson
2021-03-24 16:12:22 +00:00
committed by GitHub
parent 6442f4edd8
commit 578abd8db4
6 changed files with 317 additions and 199 deletions

View File

@@ -306,7 +306,7 @@ namespace snmalloc
*/
Slab* slab = Metaslab::get_slab(p);
Metaslab& meta = super->get_meta(slab);
sizeclass_t sizeclass = meta.sizeclass;
sizeclass_t sizeclass = meta.sizeclass();
small_dealloc_checked_sizeclass(super, slab, p, sizeclass);
return;
@@ -361,7 +361,7 @@ namespace snmalloc
Slab* slab = Metaslab::get_slab(p);
Metaslab& meta = super->get_meta(slab);
sizeclass_t sc = meta.sizeclass;
sizeclass_t sc = meta.sizeclass();
void* slab_end = pointer_offset(slab, SLAB_SIZE);
return external_pointer<location>(p, sc, slab_end);
@@ -436,7 +436,7 @@ namespace snmalloc
Slab* slab = Metaslab::get_slab(p);
Metaslab& meta = super->get_meta(slab);
return sizeclass_to_size(meta.sizeclass);
return sizeclass_to_size(meta.sizeclass());
}
if (likely(chunkmap_slab_kind == CMMediumslab))
@@ -1170,7 +1170,7 @@ namespace snmalloc
{
Slab* slab = Metaslab::get_slab(p);
check_client(
sizeclass == super->get_meta(slab).sizeclass,
sizeclass == super->get_meta(slab).sizeclass(),
"Claimed small deallocation with mismatching size class");
small_dealloc_checked_sizeclass(super, slab, p, sizeclass);