## Summary - ChatGPT により bench_profile.h の setenv segfault を修正(RTLD_NEXT 経由に切り替え) - core/box/pool_zero_mode_box.h 新設:ENV キャッシュ経由で ZERO_MODE を統一管理 - core/hakmem_pool.c で zero mode に応じた memset 制御(FULL/header/off) - A/B テスト結果:ZERO_MODE=header で +15.34% improvement(1M iterations, C6-heavy) ## Files Modified - core/box/pool_api.inc.h: pool_zero_mode_box.h include - core/bench_profile.h: glibc setenv → malloc+putenv(segfault 回避) - core/hakmem_pool.c: zero mode 参照・制御ロジック - core/box/pool_zero_mode_box.h (新設): enum/getter - CURRENT_TASK.md: Phase ML1 結果記載 ## Test Results | Iterations | ZERO_MODE=full | ZERO_MODE=header | Improvement | |-----------|----------------|-----------------|------------| | 10K | 3.06 M ops/s | 3.17 M ops/s | +3.65% | | 1M | 23.71 M ops/s | 27.34 M ops/s | **+15.34%** | 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
238 lines
7.8 KiB
C
238 lines
7.8 KiB
C
// hak_core_init.inc.h — Box: init/shutdown
|
||
#ifndef HAK_CORE_INIT_INC_H
|
||
#define HAK_CORE_INIT_INC_H
|
||
|
||
#include "hakmem_phase7_config.h" // Phase 7 Task 3
|
||
#include "box/libm_reloc_guard_box.h"
|
||
#include "box/init_bench_preset_box.h"
|
||
#include "box/init_diag_box.h"
|
||
#include "box/init_env_box.h"
|
||
#include "../tiny_destructors.h"
|
||
|
||
// Debug-only SIGSEGV handler (gated by HAKMEM_DEBUG_SEGV)
|
||
static void hakmem_sigsegv_handler(int sig) {
|
||
(void)sig;
|
||
const char* msg = "\n[HAKMEM] Segmentation Fault\n";
|
||
ssize_t written = write(2, msg, 29);
|
||
(void)written;
|
||
|
||
#if !HAKMEM_BUILD_RELEASE
|
||
// Dump Class 1 (16B) last push info for debugging
|
||
tiny_debug_dump_last_push(1);
|
||
#endif
|
||
|
||
// Restore default handler and re-raise
|
||
signal(sig, SIG_DFL);
|
||
raise(sig);
|
||
}
|
||
|
||
// Phase 7 Task 3: Pre-warm TLS cache helper
|
||
// Pre-allocate blocks to reduce first-allocation miss penalty
|
||
// Note: This function is defined later in hakmem.c after sll_refill_small_from_ss is available
|
||
// (moved out of header to avoid linkage issues)
|
||
|
||
static void hak_init_impl(void);
|
||
static pthread_once_t g_init_once = PTHREAD_ONCE_INIT;
|
||
|
||
void hak_init(void) {
|
||
(void)pthread_once(&g_init_once, hak_init_impl);
|
||
}
|
||
|
||
static void hak_init_impl(void) {
|
||
libm_reloc_guard_run();
|
||
HAK_TRACE("[init_impl_enter]\n");
|
||
g_init_thread = pthread_self();
|
||
atomic_store_explicit(&g_initializing, 1, memory_order_release);
|
||
|
||
// Phase 6.X P0 FIX (2025-10-24): Initialize Box 3 (Syscall Layer) FIRST!
|
||
// This MUST be called before ANY allocation (Tiny/Mid/Large/Learner)
|
||
// dlsym() initializes function pointers to real libc (bypasses LD_PRELOAD)
|
||
hkm_syscall_init();
|
||
HAK_TRACE("[init_impl_after_syscall_init]\n");
|
||
|
||
// CRITICAL FIX (BUG #10): Pre-detect jemalloc ONCE during init, not on hot path!
|
||
// This prevents infinite recursion: malloc → hak_jemalloc_loaded → dlopen → malloc → ...
|
||
// We protect dlopen's internal malloc calls with g_hakmem_lock_depth
|
||
extern int g_jemalloc_loaded; // Declared in hakmem.c
|
||
if (g_jemalloc_loaded < 0) {
|
||
void* h = dlopen("libjemalloc.so.2", RTLD_NOLOAD | RTLD_NOW);
|
||
if (!h) h = dlopen("libjemalloc.so.1", RTLD_NOLOAD | RTLD_NOW);
|
||
g_jemalloc_loaded = (h != NULL) ? 1 : 0;
|
||
if (h) dlclose(h);
|
||
if (g_jemalloc_loaded) {
|
||
HAKMEM_LOG("Detected jemalloc: will avoid interposing\n");
|
||
}
|
||
}
|
||
HAK_TRACE("[init_impl_after_jemalloc_probe]\n");
|
||
|
||
box_diag_install_sigsegv_handler(hakmem_sigsegv_handler);
|
||
|
||
// NEW Phase 6.11.1: Initialize debug timing
|
||
hkm_timing_init();
|
||
|
||
// NEW Phase 6.11.1: Initialize whale fast-path cache
|
||
hkm_whale_init();
|
||
|
||
// NEW Phase Hybrid: Initialize Mid Range MT allocator (8-32KB, mimalloc-style)
|
||
|
||
// NEW Phase 6.8: Initialize configuration system (replaces init_free_policy + init_thp_policy)
|
||
hak_config_init();
|
||
|
||
// Phase 6.16: Initialize FrozenPolicy (SACS-3)
|
||
hkm_policy_init();
|
||
|
||
box_init_env_flags();
|
||
box_diag_record_baseline();
|
||
|
||
HAKMEM_LOG("Initialized (PoC version)\n");
|
||
HAKMEM_LOG("Sampling rate: 1/%d\n", SAMPLING_RATE);
|
||
HAKMEM_LOG("Max sites: %d\n", MAX_SITES);
|
||
|
||
box_diag_print_banner();
|
||
box_init_bench_presets();
|
||
|
||
// NEW Phase 6.8: Feature-gated initialization (check g_hakem_config flags)
|
||
if (HAK_ENABLED_ALLOC(HAKMEM_FEATURE_POOL)) {
|
||
hak_pool_init();
|
||
}
|
||
|
||
// NEW Phase 6.13: L2.5 LargePool (64KB-1MB allocations)
|
||
hak_l25_pool_init();
|
||
|
||
if (!g_bench_tiny_only && HAK_ENABLED_CACHE(HAKMEM_FEATURE_BIGCACHE)) {
|
||
hak_bigcache_init();
|
||
hak_bigcache_set_free_callback(bigcache_free_callback);
|
||
}
|
||
|
||
if (!g_bench_tiny_only && HAK_ENABLED_LEARNING(HAKMEM_FEATURE_ELO)) {
|
||
hak_elo_init();
|
||
// Phase 6.11.4 P0-2: Initialize cached strategy to default (strategy 0)
|
||
atomic_store(&g_cached_strategy_id, 0);
|
||
}
|
||
|
||
if (!g_bench_tiny_only && HAK_ENABLED_MEMORY(HAKMEM_FEATURE_BATCH_MADVISE)) {
|
||
hak_batch_init();
|
||
}
|
||
|
||
if (!g_bench_tiny_only && HAK_ENABLED_LEARNING(HAKMEM_FEATURE_EVOLUTION)) {
|
||
hak_evo_init();
|
||
}
|
||
|
||
if (!g_bench_tiny_only) {
|
||
// Phase 6.16: Initialize ACE stats (sampling) – default off
|
||
hkm_ace_stats_init();
|
||
// Phase 6.16: Initialize sampling profiler – default off
|
||
hkm_prof_init();
|
||
// Size histogram sampling (optional)
|
||
hkm_size_hist_init();
|
||
}
|
||
|
||
if (!g_bench_tiny_only) {
|
||
// Start CAP learner (optional, env-gated)
|
||
hkm_learner_init();
|
||
}
|
||
|
||
// NEW Phase 6.10: Site Rules (MVP: always ON)
|
||
// MT note: default disabled unless HAKMEM_SITE_RULES=1
|
||
char* sr_env = getenv("HAKMEM_SITE_RULES");
|
||
g_site_rules_enabled = (sr_env && atoi(sr_env) != 0);
|
||
if (!g_bench_tiny_only && g_site_rules_enabled) {
|
||
hak_site_rules_init();
|
||
}
|
||
|
||
// Phase 22: Tiny Pool initialization now LAZY (per-class on first use)
|
||
// hak_tiny_init() moved to lazy_init_class() in hakmem_tiny_lazy_init.inc.h
|
||
// OLD: hak_tiny_init(); (eager init of all 8 classes → 94.94% page faults)
|
||
// NEW: Lazy init triggered by tiny_alloc_fast() → only used classes initialized
|
||
|
||
tiny_destructors_configure_from_env();
|
||
tiny_destructors_register_exit();
|
||
|
||
// NEW Phase ACE: Initialize Adaptive Control Engine
|
||
hkm_ace_controller_init(&g_ace_controller);
|
||
if (g_ace_controller.enabled) {
|
||
hkm_ace_controller_start(&g_ace_controller);
|
||
HAKMEM_LOG("ACE Learning Layer enabled and started\n");
|
||
}
|
||
|
||
// Phase 20-1: Aggressive TLS SLL + SuperSlab prewarming (ChatGPT strategy)
|
||
// Box SS-HotPrewarm: ENV-controlled per-class prewarm with page fault reduction
|
||
#if HAKMEM_TINY_PREWARM_TLS
|
||
#include "box/ss_hot_prewarm_box.h"
|
||
int total_prewarmed = box_ss_hot_prewarm_all();
|
||
(void)total_prewarmed;
|
||
HAKMEM_LOG("TLS cache pre-warmed: %d blocks total (Phase 20-1)\n", total_prewarmed);
|
||
// After TLS prewarm, cascade some hot blocks into SFC to raise early hit rate
|
||
{
|
||
extern int g_sfc_enabled;
|
||
if (g_sfc_enabled) {
|
||
extern void sfc_cascade_from_tls_initial(void);
|
||
sfc_cascade_from_tls_initial();
|
||
}
|
||
}
|
||
#endif
|
||
|
||
atomic_store_explicit(&g_initializing, 0, memory_order_release);
|
||
// Publish that initialization is complete
|
||
atomic_thread_fence(memory_order_seq_cst);
|
||
g_initialized = 1;
|
||
}
|
||
|
||
void hak_shutdown(void) {
|
||
if (!g_initialized) return;
|
||
|
||
// NEW Phase ACE: Shutdown Adaptive Control Engine FIRST (before other subsystems)
|
||
hkm_ace_controller_destroy(&g_ace_controller);
|
||
|
||
if (!g_bench_tiny_only) {
|
||
HAKMEM_LOG("Shutting down...\n");
|
||
hak_print_stats();
|
||
}
|
||
|
||
// NEW Phase 6.9: Shutdown L2 Pool
|
||
if (!g_bench_tiny_only) hak_pool_shutdown();
|
||
|
||
// NEW Phase 6.13: Shutdown L2.5 LargePool
|
||
if (!g_bench_tiny_only) hak_l25_pool_shutdown();
|
||
|
||
// NEW: Shutdown BigCache Box
|
||
if (!g_bench_tiny_only) hak_bigcache_shutdown();
|
||
|
||
// NEW Phase 6.2: Shutdown ELO Strategy Selection
|
||
if (!g_bench_tiny_only) hak_elo_shutdown();
|
||
|
||
// NEW Phase 6.3: Shutdown madvise Batching
|
||
if (!g_bench_tiny_only) hak_batch_shutdown();
|
||
|
||
// NEW Phase 6.10: Shutdown Site Rules
|
||
if (!g_bench_tiny_only) hak_site_rules_shutdown();
|
||
|
||
// NEW Phase 6.12: Print Tiny Pool statistics
|
||
if (!g_bench_tiny_only) hak_tiny_print_stats();
|
||
|
||
// NEW Phase 6.11.1: Print whale cache statistics
|
||
if (!g_bench_tiny_only) {
|
||
hkm_whale_dump_stats();
|
||
// NEW Phase 6.11.1: Shutdown whale cache
|
||
hkm_whale_shutdown();
|
||
}
|
||
|
||
// NEW Phase 6.11.1: Shutdown debug timing (must be last!)
|
||
if (!g_bench_tiny_only) hkm_timing_shutdown();
|
||
|
||
// Phase 6.16: Dump sampling profiler
|
||
if (!g_bench_tiny_only) hkm_prof_shutdown();
|
||
|
||
// Stop learner thread
|
||
if (!g_bench_tiny_only) hkm_learner_shutdown();
|
||
|
||
// Stop Tiny background components (e.g., Intelligence Engine)
|
||
hak_tiny_shutdown();
|
||
|
||
g_initialized = 0;
|
||
}
|
||
|
||
|
||
|
||
#endif // HAK_CORE_INIT_INC_H
|