#ifndef HAKMEM_FREE_PATH_STATS_BOX_H #define HAKMEM_FREE_PATH_STATS_BOX_H #include #include #include #include "../hakmem_build_flags.h" typedef struct FreePathStats { uint64_t total_calls; uint64_t c7_ultra_fast; uint64_t c6_ultra_free_fast; // Phase 4-2: C6 ULTRA-free uint64_t c6_ultra_alloc_hit; // Phase 4-4: C6 ULTRA-alloc (TLS pop) uint64_t c6_ifl_push; // Phase TLS-UNIFY-3: C6 intrusive push uint64_t c6_ifl_pop; // Phase TLS-UNIFY-3: C6 intrusive pop uint64_t c6_ifl_fallback; // Phase TLS-UNIFY-3: C6 intrusive fallback (slow) uint64_t c5_ultra_free_fast; // Phase 5-1: C5 ULTRA-free uint64_t c5_ultra_alloc_hit; // Phase 5-2: C5 ULTRA-alloc (TLS pop) uint64_t c4_ultra_free_fast; // Phase 6: C4 ULTRA-free (cap=64) uint64_t c4_ultra_alloc_hit; // Phase 6: C4 ULTRA-alloc (TLS pop) uint64_t smallheap_v3_fast; uint64_t smallheap_v6_fast; uint64_t smallheap_v7_fast; // Phase v7-2: SmallHeap v7 fast free uint64_t tiny_heap_v1_fast; uint64_t pool_v1_fast; uint64_t remote_free; uint64_t super_lookup_called; uint64_t legacy_fallback; // Phase 4-1: Legacy per-class breakdown uint64_t legacy_by_class[8]; // C0-C7 の Legacy fallback 内訳 // Phase POLICY-FAST-PATH-V2: Fast-path policy skip uint64_t policy_fast_v2_skip; // Phase POLICY-FAST-PATH-V2 fast-path skips // Phase 9: MONO DUALHOT hit uint64_t mono_dualhot_hit; // Phase 9: C0-C3 direct path (monolithic free_tiny_fast) // Phase 10: MONO LEGACY DIRECT hit uint64_t mono_legacy_direct_hit; // Phase 10: C4-C7 legacy direct path (skip policy snapshot) } FreePathStats; // ENV gate static inline bool free_path_stats_enabled(void) { #if !HAKMEM_DEBUG_COUNTERS return false; #else static int g_enabled = -1; // -1: unknown, 0: off, 1: on static int g_probe_left = 64; // tolerate early getenv() instability (bench_profile putenv) if (__builtin_expect(g_enabled == 1, 1)) return true; if (__builtin_expect(g_enabled == 0, 1)) return false; const char* e = getenv("HAKMEM_FREE_PATH_STATS"); if (e && *e) { g_enabled = (*e != '0') ? 1 : 0; return g_enabled == 1; } if (g_probe_left-- > 0) { return false; // keep g_enabled==-1, retry later } g_enabled = 0; return false; #endif } // Global stats instance extern FreePathStats g_free_path_stats; // Increment macros (with unlikely guard) #if HAKMEM_DEBUG_COUNTERS #define FREE_PATH_STAT_INC(field) \ do { if (__builtin_expect(free_path_stats_enabled(), 0)) { \ g_free_path_stats.field++; \ } } while(0) #else #define FREE_PATH_STAT_INC(field) ((void)0) #endif #endif // HAKMEM_FREE_PATH_STATS_BOX_H