// wrapper_env_box.h - Environment variable cache for malloc/free wrappers // Eliminates getenv() calls from malloc/free hot paths #pragma once #include typedef struct { int inited; int step_trace; // HAKMEM_STEP_TRACE (default: 0) int ld_safe_mode; // HAKMEM_LD_SAFE (default: 1) int free_wrap_trace; // HAKMEM_FREE_WRAP_TRACE (default: 0) int wrap_diag; // HAKMEM_WRAP_DIAG (default: 0) - log first few libc fallbacks int wrap_shape; // HAKMEM_WRAP_SHAPE (default: 0) - Phase 2 B4: malloc/free hot/cold split } wrapper_env_cfg_t; extern wrapper_env_cfg_t g_wrapper_env; void wrapper_env_init_once(void); // Bench helper: re-read ENV after bench_profile putenv defaults. // This keeps wrapper hot paths getenv-free while still allowing HAKMEM_PROFILE presets. void wrapper_env_refresh_from_env(void); static inline const wrapper_env_cfg_t* wrapper_env_cfg(void) { // Constructor ensures init at library load time // This check prevents repeated initialization in multi-threaded context if (__builtin_expect(!g_wrapper_env.inited, 0)) { wrapper_env_init_once(); } return &g_wrapper_env; }