mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-06 15:29:31 +03:00
do not reclaim segments if free-ing from a thread with an already abandoned heap (issue #944)
This commit is contained in:
parent
2b0d039cf3
commit
ee92b337b9
1 changed files with 3 additions and 2 deletions
|
@ -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)) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue