merge subproc stats on delete

This commit is contained in:
daanx 2024-12-21 10:53:34 -08:00
parent dece8a587b
commit 95aeda4cdd
3 changed files with 16 additions and 12 deletions

View file

@ -203,6 +203,7 @@ void _mi_heap_page_reclaim(mi_heap_t* heap, mi_page_t* page);
// "stats.c" // "stats.c"
void _mi_stats_done(mi_stats_t* stats); void _mi_stats_done(mi_stats_t* stats);
void _mi_stats_merge_from(mi_stats_t* to, mi_stats_t* from);
mi_msecs_t _mi_clock_now(void); mi_msecs_t _mi_clock_now(void);
mi_msecs_t _mi_clock_end(mi_msecs_t start); mi_msecs_t _mi_clock_end(mi_msecs_t start);
mi_msecs_t _mi_clock_start(void); mi_msecs_t _mi_clock_start(void);

View file

@ -382,6 +382,10 @@ void mi_subproc_delete(mi_subproc_id_t subproc_id) {
mi_lock_release(&subproc->os_pages_lock); mi_lock_release(&subproc->os_pages_lock);
} }
if (!safe_to_delete) return; if (!safe_to_delete) return;
// merge stats back into the main subproc?
_mi_stats_merge_from(&_mi_subproc_main()->stats, &subproc->stats);
// safe to release // safe to release
// todo: should we refcount subprocesses? // todo: should we refcount subprocesses?
mi_lock_done(&subproc->os_pages_lock); mi_lock_done(&subproc->os_pages_lock);

View file

@ -411,14 +411,6 @@ static mi_stats_t* mi_get_tld_stats(void) {
return &_mi_tld()->stats; return &_mi_tld()->stats;
} }
static void mi_stats_merge_from(mi_stats_t* stats) {
mi_subproc_t* subproc = _mi_subproc();
if (stats != &subproc->stats) {
mi_stats_add(&subproc->stats, stats);
_mi_memzero(stats, sizeof(mi_stats_t));
}
}
void mi_stats_reset(void) mi_attr_noexcept { void mi_stats_reset(void) mi_attr_noexcept {
mi_stats_t* stats = mi_get_tld_stats(); mi_stats_t* stats = mi_get_tld_stats();
mi_subproc_t* subproc = _mi_subproc(); mi_subproc_t* subproc = _mi_subproc();
@ -427,16 +419,23 @@ void mi_stats_reset(void) mi_attr_noexcept {
if (mi_process_start == 0) { mi_process_start = _mi_clock_start(); }; if (mi_process_start == 0) { mi_process_start = _mi_clock_start(); };
} }
void mi_stats_merge(void) mi_attr_noexcept { void _mi_stats_merge_from(mi_stats_t* to, mi_stats_t* from) {
mi_stats_merge_from( mi_get_tld_stats() ); if (to != from) {
mi_stats_add(to, from);
_mi_memzero(from, sizeof(mi_stats_t));
}
} }
void _mi_stats_done(mi_stats_t* stats) { // called from `mi_thread_done` void _mi_stats_done(mi_stats_t* stats) { // called from `mi_thread_done`
mi_stats_merge_from(stats); _mi_stats_merge_from(&_mi_subproc()->stats, stats);
}
void mi_stats_merge(void) mi_attr_noexcept {
_mi_stats_done( mi_get_tld_stats() );
} }
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 {
mi_stats_merge_from(mi_get_tld_stats()); mi_stats_merge();
_mi_stats_print(&_mi_subproc()->stats, out, arg); _mi_stats_print(&_mi_subproc()->stats, out, arg);
} }