#ifndef HAKMEM_FREE_PATH_STATS_BOX_H #define HAKMEM_FREE_PATH_STATS_BOX_H #include #include #include 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 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 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 内訳 } FreePathStats; // ENV gate static inline bool free_path_stats_enabled(void) { static int g_enabled = -1; if (__builtin_expect(g_enabled == -1, 0)) { const char* e = getenv("HAKMEM_FREE_PATH_STATS"); g_enabled = (e && *e && *e != '0') ? 1 : 0; } return g_enabled; } // Global stats instance extern FreePathStats g_free_path_stats; // Increment macros (with unlikely guard) #define FREE_PATH_STAT_INC(field) \ do { if (__builtin_expect(free_path_stats_enabled(), 0)) { \ g_free_path_stats.field++; \ } } while(0) #endif // HAKMEM_FREE_PATH_STATS_BOX_H