debug_is_empty: don't dealloc() free space

We know that these are small objects and that they have already had
their cache friendly offsets applied, so jump in to the dealloc path
futher down, below the stats calls.

Split small_dealloc_offseted into a wrapper around the core to avoid
inlining too much into the debug function.

While here, move the handling of the Remote objects into its own block
so that `p` is out of scope thereafter.

Fixes https://github.com/microsoft/snmalloc/issues/98
This commit is contained in:
Nathaniel Filardo
2019-11-14 20:31:04 +00:00
parent 97c87f2e91
commit 574700318e

View File

@@ -895,13 +895,15 @@ namespace snmalloc
};
// Destroy the message queue so that it has no stub message.
Remote* p = message_queue().destroy();
while (p != nullptr)
{
Remote* n = p->non_atomic_next;
handle_dealloc_remote(p);
p = n;
Remote* p = message_queue().destroy();
while (p != nullptr)
{
Remote* n = p->non_atomic_next;
handle_dealloc_remote(p);
p = n;
}
}
for (size_t i = 0; i < NUM_SMALL_CLASSES; i++)
@@ -911,7 +913,10 @@ namespace snmalloc
while (prev != nullptr)
{
auto n = Metaslab::follow_next(prev);
dealloc(remove_cache_friendly_offset(prev, i));
Superslab* super = Superslab::get(prev);
small_dealloc_offseted_inner(super, prev, i);
prev = n;
}
@@ -1222,6 +1227,12 @@ namespace snmalloc
MEASURE_TIME(small_dealloc, 4, 16);
stats().sizeclass_dealloc(sizeclass);
small_dealloc_offseted_inner(super, p, sizeclass);
}
SNMALLOC_FAST_PATH void small_dealloc_offseted_inner(
Superslab* super, void* p, sizeclass_t sizeclass)
{
Slab* slab = Slab::get(p);
if (likely(slab->dealloc_fast(super, p)))
return;