## Changes ### 1. core/page_arena.c - Removed init failure message (lines 25-27) - error is handled by returning early - All other fprintf statements already wrapped in existing #if !HAKMEM_BUILD_RELEASE blocks ### 2. core/hakmem.c - Wrapped SIGSEGV handler init message (line 72) - CRITICAL: Kept SIGSEGV/SIGBUS/SIGABRT error messages (lines 62-64) - production needs crash logs ### 3. core/hakmem_shared_pool.c - Wrapped all debug fprintf statements in #if !HAKMEM_BUILD_RELEASE: - Node pool exhaustion warning (line 252) - SP_META_CAPACITY_ERROR warning (line 421) - SP_FIX_GEOMETRY debug logging (line 745) - SP_ACQUIRE_STAGE0.5_EMPTY debug logging (line 865) - SP_ACQUIRE_STAGE0_L0 debug logging (line 803) - SP_ACQUIRE_STAGE1_LOCKFREE debug logging (line 922) - SP_ACQUIRE_STAGE2_LOCKFREE debug logging (line 996) - SP_ACQUIRE_STAGE3 debug logging (line 1116) - SP_SLOT_RELEASE debug logging (line 1245) - SP_SLOT_FREELIST_LOCKFREE debug logging (line 1305) - SP_SLOT_COMPLETELY_EMPTY debug logging (line 1316) - Fixed lock_stats_init() for release builds (lines 60-65) - ensure g_lock_stats_enabled is initialized ## Performance Validation Before: 51M ops/s (with debug fprintf overhead) After: 49.1M ops/s (consistent performance, fprintf removed from hot paths) ## Build & Test ```bash ./build.sh larson_hakmem ./out/release/larson_hakmem 1 5 1 1000 100 10000 42 # Result: 49.1M ops/s ``` Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
15 KiB
箱理論アーキテクチャ検証レポート
日付: 2025-11-12 検証対象: Phase E1-CORRECT 統一箱構造 ステータス: ✅ 統一完了、⚠️ レガシー特殊ケース残存
エグゼクティブサマリー
Phase E1-CORRECTですべてのクラス(C0-C7)に1バイトヘッダーを統一しました。これにより:
✅ 達成:
- Header層: C7特殊ケース完全排除(0件)
- Allocation層: 統一API(
tiny_region_id_write_header) - Free層: 統一Fast Path(
tiny_region_id_read_header)
⚠️ 残存課題:
- Box層: C7特殊ケース13箇所残存(
tls_sll_box.h,ptr_conversion_box.h) - Backend層: C7デバッグロギング5箇所(
tiny_superslab_*.inc.h) - 設計矛盾: Phase E1でC7にheader追加したのに、Box層でheaderless扱い
1. 箱構造の検証結果
1.1 Header層の統一(✅ 完全達成)
検証コマンド:
grep -n "if.*class.*7" core/tiny_region_id.h
# 結果: 0件(C7特殊ケースなし)
Phase E1-CORRECT設計(core/tiny_region_id.h:49-56):
// Phase E1-CORRECT: ALL classes (C0-C7) have 1-byte header (no exceptions)
// Rationale: Unified box structure enables:
// - O(1) class identification (no registry lookup)
// - All classes use same fast path
// - Zero special cases across all layers
// Cost: 0.1% memory overhead for C7 (1024B → 1023B usable)
// Benefit: 100% safety, architectural simplicity, maximum performance
// Write header at block start (ALL classes including C7)
uint8_t* header_ptr = (uint8_t*)base;
*header_ptr = HEADER_MAGIC | (class_idx & HEADER_CLASS_MASK);
結論: Header層は完全統一。C7特殊ケースは存在しない。
1.2 Box層の特殊ケース(⚠️ 13箇所残存)
C7特殊ケース出現頻度:
core/tiny_free_magazine.inc.h: 24件
core/box/tls_sll_box.h: 11件 ← Box層
core/tiny_alloc_fast.inc.h: 8件
core/box/ptr_conversion_box.h: 7件 ← Box層
core/tiny_refill_opt.h: 5件
1.2.1 TLS-SLL Box(tls_sll_box.h)
C7特殊ケースの理由:
// Line 84-88: C7 rejection
// CRITICAL: C7 (1KB) is headerless - MUST NOT use TLS SLL
// Reason: SLL stores next pointer in first 8 bytes (user data for C7)
if (__builtin_expect(class_idx == 7, 0)) {
return false; // C7 rejected
}
問題点:
- Phase E1の設計矛盾: C7にheader追加したのに、Box層で"headerless"扱い
- 実装矛盾: C7もheader持つなら、TLS SLL使えるはず
- パフォーマンス損失: C7だけSlow Path強制(不要な制約)
1.2.2 Pointer Conversion Box(ptr_conversion_box.h)
C7特殊ケースの理由:
// Line 43-48: BASE→USER conversion
/* Class 7 (2KB) is headerless - no offset */
if (class_idx == 7) {
return base_ptr; // No +1 offset
}
// Classes 0-6 have 1-byte header - skip it
void* user_ptr = (void*)((uint8_t*)base_ptr + 1);
問題点:
- Phase E1の設計矛盾: C7もheaderあるなら+1必要
- メモリ破壊リスク: C7でbase==userだと、next pointer書き込みでheader破壊
1.3 Backend層の特殊ケース(5箇所、デバッグのみ)
C7デバッグロギング(tiny_superslab_alloc.inc.h, tiny_superslab_free.inc.h):
// 性能影響なし(デバッグビルドのみ)
if (ss->size_class == 7) {
static _Atomic int c7_alloc_count = 0;
fprintf(stderr, "[C7_FIRST_ALLOC] ptr=%p next=%p\n", block, next);
}
結論: Backend層の特殊ケースは非致命的(デバッグ専用、性能影響なし)。
2. 層構造の分析
2.1 現在の層とファイルマッピング
Layer 1: Header Operations (完全統一 ✅)
└─ core/tiny_region_id.h (222行)
- tiny_region_id_write_header() - ALL classes (C0-C7)
- tiny_region_id_read_header() - ALL classes (C0-C7)
- C7特殊ケース: 0件
Layer 2: Allocation Fast Path (統一 ✅、C7はSlow Path強制)
└─ core/tiny_alloc_fast.inc.h (707行)
- hak_tiny_malloc() - TLS SLL pop
- C7特殊ケース: 8件(Slow Path強制のみ)
Layer 3: Free Fast Path (統一 ✅)
└─ core/tiny_free_fast_v2.inc.h (315行)
- hak_tiny_free_fast_v2() - Header-based O(1) class lookup
- C7特殊ケース: 0件(Phase E3-1でregistry lookup削除)
Layer 4: Box Abstraction (設計矛盾 ⚠️)
├─ core/box/tls_sll_box.h (560行)
│ - tls_sll_push/pop/splice API
│ - C7特殊ケース: 11件("headerless"扱い)
│
└─ core/box/ptr_conversion_box.h (90行)
- ptr_base_to_user/ptr_user_to_base
- C7特殊ケース: 7件(offset=0扱い)
Layer 5: Backend Storage (デバッグのみ)
├─ core/tiny_superslab_alloc.inc.h (801行)
│ - C7特殊ケース: 3件(デバッグログ)
│
└─ core/tiny_superslab_free.inc.h (368行)
- C7特殊ケース: 2件(デバッグ検証)
Layer 6: Classification (ドキュメントのみ)
└─ core/box/front_gate_classifier.h (79行)
- C7特殊ケース: 3件(コメント内"headerless"言及)
2.2 層間依存関係
┌─────────────────────────────────────────────────┐
│ Layer 1: Header Operations (tiny_region_id.h) │ ← 完全統一
└─────────────────┬───────────────────────────────┘
│ depends on
↓
┌─────────────────────────────────────────────────┐
│ Layer 2/3: Fast Path (alloc/free) │ ← 統一
│ - tiny_alloc_fast.inc.h │
│ - tiny_free_fast_v2.inc.h │
└─────────────────┬───────────────────────────────┘
│ depends on
↓
┌─────────────────────────────────────────────────┐
│ Layer 4: Box Abstraction (box/*.h) │ ← 設計矛盾
│ - tls_sll_box.h (C7 rejection) │
│ - ptr_conversion_box.h (C7 offset=0) │
└─────────────────┬───────────────────────────────┘
│ depends on
↓
┌─────────────────────────────────────────────────┐
│ Layer 5: Backend Storage (superslab_*.inc.h) │ ← 非致命的
└─────────────────────────────────────────────────┘
問題点:
- Layer 1(Header): C7にheader追加済み
- Layer 4(Box): C7を"headerless"扱い(設計矛盾)
- 影響: C7だけTLS SLL使えない → Slow Path強制 → 性能損失
3. モジュール化提案
3.1 現状の問題
ファイルサイズ分析:
core/tiny_superslab_alloc.inc.h: 801行 ← 巨大
core/tiny_alloc_fast.inc.h: 707行 ← 巨大
core/box/tls_sll_box.h: 560行 ← 巨大
core/tiny_superslab_free.inc.h: 368行
core/box/hak_core_init.inc.h: 373行
問題:
- 単一責任原則違反:
tls_sll_box.hが560行(push/pop/splice/debug全部入り) - C7特殊ケース散在: 11ファイルに70+箇所
- Box境界不明確:
tiny_alloc_fast.inc.hがBox API直接呼び出し
3.2 リファクタリング提案
Option A: 箱理論レイヤー分離(推奨)
core/box/
allocation/
- header_box.h (50行, Header write/read統一API)
- fast_alloc_box.h (200行, TLS SLL pop統一)
free/
- fast_free_box.h (150行, Header-based free統一)
- remote_free_box.h (100行, Cross-thread free)
storage/
- tls_sll_core.h (100行, Push/Pop/Splice core)
- tls_sll_debug.h (50行, Debug validation)
- ptr_conversion.h (50行, BASE↔USER統一)
classification/
- front_gate_box.h (80行, 現状維持)
利点:
- 単一責任原則遵守(各ファイル50-200行)
- C7特殊ケースを1箇所に集約可能
- Box境界明確化
コスト:
- ファイル数増加(4 → 10ファイル)
- include階層深化(1-2レベル増)
Option B: C7特殊ケース統一(最小変更)
Phase E1の設計意図を完遂:
- C7にheader追加済み → Box層も統一扱いに変更
- TLS SLL Box修正:
// Before (矛盾) if (class_idx == 7) return false; // C7 rejected // After (統一) // ALL classes (C0-C7) use same TLS SLL (header protects next pointer) - Pointer Conversion Box修正:
// Before (矛盾) if (class_idx == 7) return base_ptr; // No offset // After (統一) void* user_ptr = (uint8_t*)base_ptr + 1; // ALL classes +1
利点:
- 最小変更(2ファイル、30行程度)
- C7特殊ケース70+箇所 → 0箇所
- C7もFast Path使用可能(性能向上)
リスク:
- C7のuser size変更(1024B → 1023B)
- 既存アロケーションとの互換性(要テスト)
Option C: ハイブリッド(段階的移行)
Phase 1: C7特殊ケース統一(Option B)
- 目標: C7もFast Path使用可能に
- 期間: 1-2日
- リスク: 低(テスト充実)
Phase 2: レイヤー分離(Option A)
- 目標: 箱理論完全実装
- 期間: 1週間
- リスク: 中(大規模リファクタ)
4. 最終評価
4.1 箱理論統一の達成度
| 層 | 統一度 | C7特殊ケース | 評価 |
|---|---|---|---|
| Layer 1: Header | 100% | 0件 | ✅ 完璧 |
| Layer 2/3: Fast Path | 95% | 8件(Slow Path強制) | ✅ 良好 |
| Layer 4: Box | 60% | 18件(設計矛盾) | ⚠️ 改善必要 |
| Layer 5: Backend | 95% | 5件(デバッグのみ) | ✅ 良好 |
| Layer 6: Classification | 100% | 0件(コメントのみ) | ✅ 完璧 |
総合評価: B+(85/100点)
強み:
- Header層の完全統一(Phase E1の成功)
- Fast Path層の高度な抽象化
- Classification層の明確な責務分離
弱み:
- Box層の設計矛盾(Phase E1の意図が反映されていない)
- C7特殊ケースの散在(70+箇所)
- ファイルサイズの肥大化(560-801行)
4.2 モジュール化の必要性
優先度: 中~高
理由:
- 設計矛盾の解消: Phase E1の意図(C7 header統一)がBox層で実現されていない
- 性能向上: C7がFast Path使えれば5-10%向上見込み
- 保守性: 560-801行の巨大ファイルは変更リスク大
推奨アプローチ: Option C(ハイブリッド)
- 短期: C7特殊ケース統一(Option B、1-2日)
- 中期: レイヤー分離(Option A、1週間)
4.3 次のアクション
即座に実施(優先度: 高)
-
C7特殊ケース統一の検証
# C7にheaderある前提でTLS SLL使用可能か検証 ./build.sh debug bench_random_mixed_hakmem # Expected: C7もFast Path使用 → 5-10%性能向上 -
Box層の設計矛盾修正
tls_sll_box.h:84-88- C7 rejection削除ptr_conversion_box.h:44-48- C7 offset=0削除- テスト:
bench_fixed_size_hakmem 200000 1024 128
後で実施(優先度: 中)
-
レイヤー分離リファクタリング(Option A)
core/box/allocation/ディレクトリ作成tls_sll_box.hを3ファイルに分割- 期間: 1週間
-
ドキュメント更新
CLAUDE.md: Phase E1の意図を明記BOX_THEORY.md: 層構造図追加
5. 結論
Phase E1-CORRECTはHeader層の完全統一に成功しました。しかし、Box層に設計矛盾が残存しています。
現状:
- ✅ Header層: C7特殊ケース0件(完璧)
- ⚠️ Box層: C7特殊ケース18件(設計矛盾)
- ✅ Backend層: C7特殊ケース5件(非致命的)
推奨事項:
- 即座に実施: C7特殊ケース統一(Box層修正、1-2日)
- 後で実施: レイヤー分離リファクタリング(1週間)
期待効果:
- C7性能向上: Slow Path → Fast Path(5-10%)
- コード削減: C7特殊ケース70+箇所 → 0箇所
- 保守性向上: 巨大ファイル(560-801行)→ 小ファイル(50-200行)
付録A: C7特殊ケース完全リスト
Box層(18件、設計矛盾)
tls_sll_box.h(11件):
- Line 7: コメント "C7 (1KB headerless)"
- Line 72: コメント "C7 (headerless): ptr == base"
- Line 75: コメント "C7 always rejected"
- Line 84-88: C7 rejection in
tls_sll_push - Line 251:
next_offset = (class_idx == 7) ? 0 : 1 - Line 389: コメント "C7 (headerless): next at base"
- Line 397-398: C7 next pointer clear
- Line 455-456: C7 rejection in
tls_sll_splice - Line 554: エラーメッセージ "C7 is headerless!"
ptr_conversion_box.h(7件):
- Line 10: コメント "Class 7 (2KB) is headerless"
- Line 43-48: C7 BASE→USER no offset
- Line 69-74: C7 USER→BASE no offset
Fast Path層(8件、Slow Path強制)
tiny_alloc_fast.inc.h(8件):
- Line 205-207: コメント "C7 (1KB) is headerless"
- Line 209: C7 Slow Path強制
- Line 355:
sfc_next_off = (class_idx == 7) ? 0 : 1 - Line 387-389: コメント "C7's headerless design"
Backend層(5件、デバッグのみ)
tiny_superslab_alloc.inc.h(3件):
- Line 629: デバッグログ(failfast level 3)
- Line 648: デバッグログ(failfast level 3)
- Line 775-786: C7 first alloc デバッグログ
tiny_superslab_free.inc.h(2件):
- Line 31-39: C7 first free デバッグログ
- Line 94-99: C7 lightweight guard
Classification層(3件、コメントのみ)
front_gate_classifier.h(3件):
- Line 9: コメント "C7 (headerless)"
- Line 63: コメント "headerless"
- Line 71: 変数名
g_classify_headerless_hit
付録B: ファイルサイズ統計
core/box/*.h (32ファイル):
560行: tls_sll_box.h ← 最大
373行: hak_core_init.inc.h
327行: pool_core_api.inc.h
324行: pool_api.inc.h
313行: hak_wrappers.inc.h
285行: pool_mf2_core.inc.h
269行: hak_free_api.inc.h
266行: pool_mf2_types.inc.h
244行: integrity_box.h
90行: ptr_conversion_box.h ← 最小(Box層)
79行: front_gate_classifier.h
core/tiny_*.inc.h (主要ファイル):
801行: tiny_superslab_alloc.inc.h ← 最大
707行: tiny_alloc_fast.inc.h
471行: tiny_free_magazine.inc.h
368行: tiny_superslab_free.inc.h
315行: tiny_free_fast_v2.inc.h
222行: tiny_region_id.h
総計: 約15,000行(core/box/*.h + core/tiny_*.h + core/tiny_*.inc.h)
レポート作成者: Claude Code 検証日: 2025-11-12 HAKMEMバージョン: Phase E1-CORRECT