@@ -118,6 +118,22 @@ static void mi_stats_add(mi_stats_t* stats, const mi_stats_t* src) {
118
118
}
119
119
}
120
120
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
+
121
137
#undef MI_STAT_COUNT
122
138
#undef MI_STAT_COUNTER
123
139
@@ -411,6 +427,30 @@ void mi_thread_stats_print_out(mi_output_fun* out, void* arg) mi_attr_noexcept {
411
427
_mi_stats_print (mi_stats_get_default (), out , arg );
412
428
}
413
429
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
+ }
414
454
415
455
// ----------------------------------------------------------------
416
456
// Basic timer for convenience; use milli-seconds to avoid doubles
0 commit comments