avoid caching segments in pinned arenas; happes with huge OS page reservations

This commit is contained in:
Daan Leijen 2023-03-28 10:16:19 -07:00
parent 391f8bbd72
commit 6dd3073a75
2 changed files with 16 additions and 7 deletions

View file

@ -397,8 +397,10 @@ static void mi_segment_os_free(mi_segment_t* segment, mi_segments_tld_t* tld) {
if (size != MI_SEGMENT_SIZE || segment->mem_align_offset != 0 || segment->kind == MI_SEGMENT_HUGE || // only push regular segments on the cache
!_mi_segment_cache_push(segment, size, segment->memid, &segment->commit_mask, &segment->decommit_mask, segment->mem_is_large, segment->mem_is_pinned, tld->os))
{
const size_t csize = _mi_commit_mask_committed_size(&segment->commit_mask, size);
if (csize > 0 && !segment->mem_is_pinned) _mi_stat_decrease(&_mi_stats_main.committed, csize);
if (!segment->mem_is_pinned) {
const size_t csize = _mi_commit_mask_committed_size(&segment->commit_mask, size);
if (csize > 0) { _mi_stat_decrease(&_mi_stats_main.committed, csize); }
}
_mi_abandoned_await_readers(); // wait until safe to free
_mi_arena_free(segment, mi_segment_size(segment), segment->mem_alignment, segment->mem_align_offset, segment->memid, segment->mem_is_pinned /* pretend not committed to not double count decommits */, tld->stats);
}