do not reclaim segments if free-ing from a thread with an already abandoned heap (issue #944)

This commit is contained in:
Daan 2024-10-24 00:13:07 -07:00
parent 2b0d039cf3
commit ee92b337b9

View file

@ -236,11 +236,12 @@ static void mi_decl_noinline mi_free_block_delayed_mt( mi_page_t* page, mi_block
static void mi_decl_noinline mi_free_block_mt(mi_page_t* page, mi_segment_t* segment, mi_block_t* block) static void mi_decl_noinline mi_free_block_mt(mi_page_t* page, mi_segment_t* segment, mi_block_t* block)
{ {
// first see if the segment was abandoned and if we can reclaim it into our thread // first see if the segment was abandoned and if we can reclaim it into our thread
if (mi_option_is_enabled(mi_option_abandoned_reclaim_on_free) && if (_mi_option_get_fast(mi_option_abandoned_reclaim_on_free) != 0 &&
#if MI_HUGE_PAGE_ABANDON #if MI_HUGE_PAGE_ABANDON
segment->page_kind != MI_PAGE_HUGE && segment->page_kind != MI_PAGE_HUGE &&
#endif #endif
mi_atomic_load_relaxed(&segment->thread_id) == 0) mi_atomic_load_relaxed(&segment->thread_id) == 0 && // segment is abandoned?
mi_prim_get_default_heap() != (mi_heap_t*)&_mi_heap_empty) // and we did not already exit this thread (without this check, a fresh heap will be initalized (issue #944))
{ {
// the segment is abandoned, try to reclaim it into our heap // the segment is abandoned, try to reclaim it into our heap
if (_mi_segment_attempt_reclaim(mi_heap_get_default(), segment)) { if (_mi_segment_attempt_reclaim(mi_heap_get_default(), segment)) {