Phase 1 完了:環境変数整理 + fprintf デバッグガード ENV変数削除(BG/HotMag系): - core/hakmem_tiny_init.inc: HotMag ENV 削除 (~131 lines) - core/hakmem_tiny_bg_spill.c: BG spill ENV 削除 - core/tiny_refill.h: BG remote 固定値化 - core/hakmem_tiny_slow.inc: BG refs 削除 fprintf Debug Guards (#if !HAKMEM_BUILD_RELEASE): - core/hakmem_shared_pool.c: Lock stats (~18 fprintf) - core/page_arena.c: Init/Shutdown/Stats (~27 fprintf) - core/hakmem.c: SIGSEGV init message ドキュメント整理: - 328 markdown files 削除(旧レポート・重複docs) 性能確認: - Larson: 52.35M ops/s (前回52.8M、安定動作✅) - ENV整理による機能影響なし - Debug出力は一部残存(次phase で対応) 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
8.1 KiB
8.1 KiB
hakmem_tiny_free.inc 構造分析 - クイックサマリー
ファイル概要
hakmem_tiny_free.inc は HAKMEM メモリアロケータのメイン Free パスを実装する大規模ファイル
| 統計 | 値 |
|---|---|
| 総行数 | 1,711 |
| 実コード行 | 1,348 (78.7%) |
| 関数数 | 10個 |
| 最大関数 | hak_tiny_free_with_slab() - 558行 |
| 複雑度 | CC 28 (CRITICAL) |
主要責務ベークダウン
hak_tiny_free_with_slab (558行, 34.2%) ← HOTTEST - CC 28
├─ SuperSlab mode handling (64行)
├─ Same-thread TLS push (72行)
└─ Magazine/SLL/Publisher paths (413行) ← 複雑でテスト困難
hak_tiny_free_superslab (305行, 18.7%) ← CRITICAL PATH - CC 16
├─ Validation & safety checks (30行)
├─ Same-thread freelist push (79行)
└─ Remote/cross-thread queue (159行)
superslab_refill (308行, 24.1%) ← OPTIMIZATION TARGET - CC 18
├─ Mid-size simple refill (36行)
├─ SuperSlab adoption (163行)
└─ Fresh allocation (70行)
hak_tiny_free (135行, 8.3%) ← ENTRY POINT - CC 12
├─ Mode selection (BENCH, ULTRA, NORMAL)
└─ Class resolution & dispatch
Other (127行, 7.7%)
├─ Helper functions (65行) - drain, remote guard
├─ SuperSlab alloc helpers (84行)
└─ Shutdown (30行)
関数リスト(重要度順)
🔴 CRITICAL (テスト困難、複雑)
-
hak_tiny_free_with_slab() (558行)
- 複雑度: CC 28 ← NEEDS REFACTORING
- 責務: Free path の main router
- 課題: Magazine/SLL/Publisher が混在
-
superslab_refill() (308行)
- 複雑度: CC 18
- 責務: SuperSlab adoption & allocation
- 最適化: P0 で O(n) → O(1) 化予定
-
hak_tiny_free_superslab() (305行)
- 複雑度: CC 16
- 責務: SuperSlab free (same/remote)
- 課題: Remote queue sentinel validation が複雑
🟡 HIGH (重要だが理解可能)
-
superslab_alloc_from_slab() (84行)
- 複雑度: CC 4
- 責務: Single slab block allocation
-
hak_tiny_alloc_superslab() (151行)
- 複雑度: CC ~8
- 責務: SuperSlab-based allocation entry
-
hak_tiny_free() (135行)
- 複雑度: CC 12
- 責務: Global free entry point (routing only)
🟢 LOW (シンプル)
- tiny_drain_to_sll_budget() (10行) - ENV config
- tiny_drain_freelist_to_sll_once() (16行) - SLL splicing
- tiny_remote_queue_contains_guard() (21行) - Duplicate detection
- hak_tiny_shutdown() (30行) - Cleanup
主要な複雑性源
1. hak_tiny_free_with_slab() の複雑度 (CC 28)
if (!slab) {
// SuperSlab path (64行)
// ├─ SuperSlab lookup
// ├─ Validation (HAKMEM_SAFE_FREE)
// └─ if remote → hak_tiny_free_superslab()
}
// 複数の TLS キャッシュパス (72行)
// ├─ Fast path (g_fast_enable)
// ├─ TLS List (g_tls_list_enable)
// ├─ HotMag (g_hotmag_enable)
// └─ ...
// Magazine/SLL/Publisher paths (413行)
// ├─ TinyQuickSlot?
// ├─ TLS SLL?
// ├─ Magazine?
// ├─ Background spill?
// ├─ SuperRegistry spill?
// └─ Publisher fallback?
課題: Policy cascade (複数パスの判定フロー)が線形に追加されている
2. superslab_refill() の複雑度 (CC 18)
┌─ Mid-size simple refill (class >= 4)?
├─ SuperSlab adoption?
│ ├─ Cool-down check
│ ├─ First-fit or Best-fit scoring
│ ├─ Slab acquisition
│ └─ Binding
└─ Fresh allocation
├─ SuperSlab allocate
└─ Refcount management
課題: Adoption vs allocation decision が複雑 (Future P0 optimization target)
3. hak_tiny_free_superslab() の複雑度 (CC 16)
├─ Validation (bounds, magic, size_class)
├─ if (same-thread)
│ ├─ Direct freelist push
│ ├─ remote guard check
│ └─ MidTC integration
└─ else (remote)
├─ Remote queue enqueue
├─ Sentinel validation
└─ Bulk refill coordination
課題: Same vs remote path が大きく分岐
分割提案(優先度順)
Phase 1: Magazine/SLL を分離 (413行)
新ファイル: tiny_free_magazine.inc.h
メリット:
- Policy cascade を独立ファイルに隔離
- Magazine は environment-based (on/off可能)
- テスト時に mock 可能
- スパイル改善時の影響を限定
Before: hak_tiny_free_with_slab() CC 28 → 413行
After: hak_tiny_free_with_slab() CC ~8
+ tiny_free_magazine.inc.h CC ~10
Phase 2: SuperSlab allocation を分離 (394行)
新ファイル: tiny_superslab_alloc.inc.h
含める関数:
superslab_refill()(308行)superslab_alloc_from_slab()(84行)hak_tiny_alloc_superslab()(151行)- Adoption helpers
メリット:
- Allocation は free と直交
- P0 optimization (O(n)→O(1)) に集中
- Registry logic を明確化
Phase 3: SuperSlab free を分離 (305行)
新ファイル: tiny_superslab_free.inc.h
含める関数:
hak_tiny_free_superslab()(305行)- Remote queue management
- Sentinel validation
メリット:
- Remote queue logic は pure
- Cross-thread free を focused に
- Debugging (ROUTE_MARK) が簡単
分割後の構成
Current (1ファイル)
hakmem_tiny_free.inc (1,711行)
├─ Helpers & includes
├─ hak_tiny_free_with_slab (558行) ← MONOLITH
├─ SuperSlab alloc/refill (394行)
├─ SuperSlab free (305行)
├─ Main entry (135行)
└─ Shutdown (30行)
After refactoring (4ファイル)
hakmem_tiny_free.inc (450行) ← THIN ROUTER
├─ Helpers & includes
├─ hak_tiny_free (dispatch only)
├─ hak_tiny_shutdown
└─ #include directives (3個)
tiny_free_magazine.inc.h (400行)
├─ TinyQuickSlot
├─ TLS SLL push
├─ Magazine push/spill
├─ Background spill
└─ Publisher fallback
tiny_superslab_alloc.inc.h (380行) ← P0 OPTIMIZATION HERE
├─ superslab_refill (with nonempty_mask O(n)→O(1))
├─ superslab_alloc_from_slab
└─ hak_tiny_alloc_superslab
tiny_superslab_free.inc.h (290行)
├─ hak_tiny_free_superslab
├─ Remote queue management
└─ Sentinel validation
実装手順
Step 1: バックアップ
cp core/hakmem_tiny_free.inc core/hakmem_tiny_free.inc.bak
Step 2-4: 3ファイルに分割
Lines 208-620 → core/tiny_free_magazine.inc.h
Lines 626-1019 → core/tiny_superslab_alloc.inc.h
Lines 1171-1475 → core/tiny_superslab_free.inc.h
Step 5: Makefile update
hakmem_tiny_free.inc は #include で 3ファイルを参照
→ dependency に追加
Step 6: 検証
make clean && make
./larson_hakmem 2 8 128 1024 1 12345 4
# スコア変化なし を確認
分割前後の改善指標
| 指標 | Before | After | 改善 |
|---|---|---|---|
| ファイル数 | 1 | 4 | +300% (関心分離) |
| avg CC | 14.4 | 8.2 | -43% |
| max CC | 28 | 16 | -43% |
| max func size | 558行 | 308行 | -45% |
| 理解難易度 | ★★★★☆ | ★★★☆☆ | -1段階 |
| テスト容易性 | ★★☆☆☆ | ★★★★☆ | +2段階 |
関連最適化
P0 Optimization (Already in CLAUDE.md)
- File:
tiny_superslab_alloc.inc.h(after split) - Location:
superslab_refill()lines ~785-947 - Optimization: O(n) linear scan → O(1) ctz using
nonempty_mask - Expected: CPU 29.47% → 25.89% (-12%)
P1 Opportunities (After split)
- Magazine policy tuning (dedicated file で容易)
- SLL fast path 最適化 (isolation で実験容易)
- Publisher fallback 削減 (cache hit rate 改善)
ドキュメント参照
- Full Analysis:
/mnt/workdisk/public_share/hakmem/STRUCTURAL_ANALYSIS.md - Related:
CLAUDE.md(Phase 6-2.1 P0 optimization) - History:
HISTORY.md(Past refactoring lessons)
実施推奨度
★★★★★ STRONGLY RECOMMENDED
理由:
- hak_tiny_free_with_slab の CC 28 は危険域
- Magazine/SLL paths は独立policy (隔離が自然)
- P0 optimization が superslab_refill に focused
- テスト時の mock 可能性が大幅向上
- Future maintenance が容易に