mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-07-01 17:24:38 +03:00
ensure page stats are done on the subproc stats in case the tld is NULL
This commit is contained in:
parent
752dc834a9
commit
6c2cfd7830
3 changed files with 17 additions and 6 deletions
13
src/arena.c
13
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;
|
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_is_aligned(page, MI_PAGE_ALIGN));
|
||||||
mi_assert_internal(_mi_ptr_page(page)==page);
|
mi_assert_internal(_mi_ptr_page(page)==page);
|
||||||
mi_assert_internal(mi_page_is_owned(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(mi_page_is_abandoned(page));
|
||||||
mi_assert_internal(page->next==NULL && page->prev==NULL);
|
mi_assert_internal(page->next==NULL && page->prev==NULL);
|
||||||
|
|
||||||
if (tld==NULL) { tld = _mi_thread_tld(); }
|
if (stats_tld != NULL) {
|
||||||
mi_tld_stat_decrease(tld, page_bins[_mi_page_bin(page)], 1);
|
mi_tld_stat_decrease(stats_tld, page_bins[_mi_page_bin(page)], 1);
|
||||||
mi_tld_stat_decrease(tld, pages, 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 MI_DEBUG>1
|
||||||
if (page->memid.memkind==MI_MEM_ARENA && !mi_page_is_full(page)) {
|
if (page->memid.memkind==MI_MEM_ARENA && !mi_page_is_full(page)) {
|
||||||
|
|
|
@ -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);
|
_mi_arenas_collect(collect == MI_FORCE /* force purge? */, collect >= MI_FORCE /* visit all? */, heap->tld);
|
||||||
|
|
||||||
// merge statistics
|
// 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) {
|
void _mi_heap_collect_abandon(mi_heap_t* heap) {
|
||||||
|
|
|
@ -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) {
|
void _mi_stats_merge_from(mi_stats_t* to, mi_stats_t* from) {
|
||||||
|
mi_assert_internal(to != NULL && from != NULL);
|
||||||
if (to != from) {
|
if (to != from) {
|
||||||
mi_stats_add(to, from);
|
mi_stats_add(to, from);
|
||||||
_mi_memzero(from, sizeof(mi_stats_t));
|
_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);
|
_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 {
|
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 {
|
void mi_stats_print_out(mi_output_fun* out, void* arg) mi_attr_noexcept {
|
||||||
|
|
Loading…
Add table
Reference in a new issue