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:
committed by
GitHub
parent
6442f4edd8
commit
578abd8db4
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user