# Phase 2 B4: WRAPPER-SHAPE-1(malloc/free wrapper のホット/コールド分割) ## 目的 Phase 2 B3 で `malloc_tiny_fast_for_class()` の route dispatch 形は勝ち形に寄せられた。 次の “芯” は wrapper 層(`malloc/free`)の I-cache / 分岐形で、稀なチェックを `noinline,cold` に押し出してホットを最短化する。 狙いは **アルゴリズム変更ではなく「形」**: - 既存の安全チェックは削らない(移動/集約のみ) - ホットは `return` で即抜け(重複 work を作らない) - 失敗/特殊条件は cold に委譲(境界は 1 箇所) ## Box Theory(箱割り) ### L0: WrapperHotBox 責務: 通常ケースを最短で Tiny fast に到達させ、成功なら即 return。 - `malloc`: init wait → init → Tiny fast → hit で return - `free`: BenchFast → Tiny free fast → hit で return ### L1: WrapperColdBox 責務: それ以外(LD/jemalloc/force_libc/分類/所有権/フォールバック/診断)を 1 箱に集約。 境界: `HAKMEM_WRAP_SHAPE=1` のとき、入口で 1 回だけ hot/cold を分岐する。 ## 実装指示(ファイル / 形) - `core/box/hak_wrappers.inc.h` - `malloc_cold()` / `free_cold()` を `__attribute__((noinline, cold))` で追加 - `malloc()` / `free()` に `HAKMEM_WRAP_SHAPE` gate を追加 - ENV gate: - `HAKMEM_WRAP_SHAPE=0/1`(default 0) - ただしプリセットで default=1 に昇格可能(bench_profile) ## 可視化(最小) 常時ログは禁止。必要なら: - ワンショット(数回のみ) - `HAKMEM_DEBUG_COUNTERS=1` ビルド時だけのカウンタ ## Fail-Fast / 安全 - `g_hakmem_lock_depth` の ++/-- はどの return 経路でも対称に保つ - safety check の削除は禁止(移動のみ) ## A/B 結果(2025-12-13) Mixed 10-run: - `HAKMEM_WRAP_SHAPE=0`: 34,750,578 ops/s - `HAKMEM_WRAP_SHAPE=1`: 35,262,596 ops/s - mean: **+1.47%** / median: **+1.39%** → **GO** 決定: - `HAKMEM_WRAP_SHAPE` は ENV gate のまま維持しつつ、`MIXED_TINYV3_C7_SAFE` プリセットで default=1 に昇格。