diff --git a/src/arena.c b/src/arena.c index b350d092..514a0b25 100644 --- a/src/arena.c +++ b/src/arena.c @@ -790,7 +790,7 @@ mi_page_t* _mi_arenas_page_alloc(mi_heap_t* heap, size_t block_size, size_t bloc return page; } -void _mi_arenas_page_free(mi_page_t* page, mi_tld_t* tld /* can be NULL */) { +void _mi_arenas_page_free(mi_page_t* page, mi_tld_t* stats_tld /* can be NULL */) { mi_assert_internal(_mi_is_aligned(page, MI_PAGE_ALIGN)); mi_assert_internal(_mi_ptr_page(page)==page); mi_assert_internal(mi_page_is_owned(page)); @@ -798,9 +798,14 @@ void _mi_arenas_page_free(mi_page_t* page, mi_tld_t* tld /* can be NULL */) { mi_assert_internal(mi_page_is_abandoned(page)); mi_assert_internal(page->next==NULL && page->prev==NULL); - if (tld==NULL) { tld = _mi_thread_tld(); } - mi_tld_stat_decrease(tld, page_bins[_mi_page_bin(page)], 1); - mi_tld_stat_decrease(tld, pages, 1); + if (stats_tld != NULL) { + mi_tld_stat_decrease(stats_tld, page_bins[_mi_page_bin(page)], 1); + mi_tld_stat_decrease(stats_tld, pages, 1); + } + else { + mi_os_stat_decrease(page_bins[_mi_page_bin(page)], 1); + mi_os_stat_decrease(pages, 1); + } #if MI_DEBUG>1 if (page->memid.memkind==MI_MEM_ARENA && !mi_page_is_full(page)) { diff --git a/src/heap.c b/src/heap.c index 922433bf..1ce15a5c 100644 --- a/src/heap.c +++ b/src/heap.c @@ -130,7 +130,7 @@ static void mi_heap_collect_ex(mi_heap_t* heap, mi_collect_t collect) _mi_arenas_collect(collect == MI_FORCE /* force purge? */, collect >= MI_FORCE /* visit all? */, heap->tld); // merge statistics - _mi_stats_merge_from(&_mi_subproc()->stats, &heap->tld->stats); + _mi_stats_merge_thread(heap->tld); } void _mi_heap_collect_abandon(mi_heap_t* heap) { diff --git a/src/stats.c b/src/stats.c index eac6a19c..d8277427 100644 --- a/src/stats.c +++ b/src/stats.c @@ -400,6 +400,7 @@ void mi_stats_reset(void) mi_attr_noexcept { } void _mi_stats_merge_from(mi_stats_t* to, mi_stats_t* from) { + mi_assert_internal(to != NULL && from != NULL); if (to != from) { mi_stats_add(to, from); _mi_memzero(from, sizeof(mi_stats_t)); @@ -414,8 +415,13 @@ void _mi_stats_done(mi_stats_t* stats) { // called from `mi_thread_done` _mi_stats_merge_from(&_mi_subproc()->stats, stats); } +void _mi_stats_merge_thread(mi_tld_t* tld) { + mi_assert_internal(tld != NULL && tld->subproc != NULL); + _mi_stats_merge_from( &tld->subproc->stats, &tld->stats ); +} + void mi_stats_merge(void) mi_attr_noexcept { - _mi_stats_done( mi_get_tld_stats() ); + _mi_stats_merge_thread( _mi_thread_tld() ); } void mi_stats_print_out(mi_output_fun* out, void* arg) mi_attr_noexcept {