@@ -118,6 +118,22 @@ static void mi_stats_add(mi_stats_t* stats, const mi_stats_t* src) {
118118 }
119119}
120120
121+ static void mi_stat_atomic_copy (mi_stat_count_t * dst , const mi_stat_count_t * src ) {
122+ if (dst == src ) return ;
123+ if (src -> total == 0 ) return ;
124+
125+ dst -> total = (mi_atomic_loadi64_relaxed ((_Atomic (int64_t )* )(& src -> total )));
126+ dst -> current = (mi_atomic_loadi64_relaxed ((_Atomic (int64_t )* )(& src -> current )));
127+ dst -> peak = (mi_atomic_loadi64_relaxed ((_Atomic (int64_t )* )(& src -> peak )));
128+ }
129+
130+ static void mi_stat_counter_atomic_copy (mi_stat_counter_t * dst , const mi_stat_counter_t * src ) {
131+ if (dst == src ) return ;
132+ if (src -> total == 0 ) return ;
133+
134+ dst -> total = (mi_atomic_loadi64_relaxed ((_Atomic (int64_t )* )(& src -> total )));
135+ }
136+
121137#undef MI_STAT_COUNT
122138#undef MI_STAT_COUNTER
123139
@@ -411,6 +427,30 @@ void mi_thread_stats_print_out(mi_output_fun* out, void* arg) mi_attr_noexcept {
411427 _mi_stats_print (mi_stats_get_default (), out , arg );
412428}
413429
430+ const mi_stats_t * mi_thread_heap_stats (const mi_heap_t * heap ) mi_attr_noexcept {
431+ return & heap -> tld -> stats ;
432+ }
433+
434+ const mi_stats_t * mi_thread_stats (void ) mi_attr_noexcept {
435+ return mi_thread_heap_stats (mi_heap_get_default ());
436+ }
437+
438+ mi_os_stats_t mi_os_stats (void ) mi_attr_noexcept {
439+ mi_os_stats_t stats ;
440+ memset (& stats , 0 , sizeof (mi_os_stats_t ));
441+
442+ mi_stat_atomic_copy (& stats .reserved , & _mi_stats_main .reserved );
443+ mi_stat_atomic_copy (& stats .committed , & _mi_stats_main .committed );
444+ mi_stat_atomic_copy (& stats .reset , & _mi_stats_main .reset );
445+ mi_stat_atomic_copy (& stats .purged , & _mi_stats_main .purged );
446+
447+ mi_stat_counter_atomic_copy (& stats .mmap_calls , & _mi_stats_main .mmap_calls );
448+ mi_stat_counter_atomic_copy (& stats .commit_calls , & _mi_stats_main .commit_calls );
449+ mi_stat_counter_atomic_copy (& stats .reset_calls , & _mi_stats_main .reset_calls );
450+ mi_stat_counter_atomic_copy (& stats .purge_calls , & _mi_stats_main .purge_calls );
451+
452+ return stats ;
453+ }
414454
415455// ----------------------------------------------------------------
416456// Basic timer for convenience; use milli-seconds to avoid doubles
0 commit comments