Files
hakmem/BOX3_REFACTORING.md

198 lines
6.4 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Box 3 Refactoring Complete - Geometry & Capacity Calculator
## 📦 **概要**
Box理論に基づき、Stride/Capacity/Slab Base計算を**単一の責任Box**に集約しました。
---
## 🎯 **Box 3の責任**
### 新設ファイル: `core/tiny_box_geometry.h`
**責任範囲**:
1. **Stride計算**: Block size + headerC7はheaderless
2. **Capacity計算**: Usable bytes / strideSlab 0は特殊容量
3. **Slab Base計算**: Slab 0の2048オフセット処理
4. **境界検証**: Linear carveのFail-Fastガード
---
## 📋 **提供API**
### 1⃣ **Stride計算**
```c
size_t tiny_stride_for_class(int class_idx);
```
- C7 (1KB): `1024` (headerless)
- C0-C6: `class_size + 1` (1-byte header)
### 2⃣ **Capacity計算**
```c
uint16_t tiny_capacity_for_slab(int slab_idx, size_t stride);
```
- Slab 0: `SUPERSLAB_SLAB0_USABLE_SIZE / stride`
- Slab 1+: `SUPERSLAB_SLAB_USABLE_SIZE / stride`
### 3⃣ **Slab Base取得**
```c
uint8_t* tiny_slab_base_for_geometry(SuperSlab* ss, int slab_idx);
```
- Slab 0: `ss + SLAB_SIZE * 0 + SUPERSLAB_SLAB0_DATA_OFFSET`
- Slab 1+: `ss + SLAB_SIZE * slab_idx`
### 4⃣ **Block Address計算**
```c
void* tiny_block_at_index(uint8_t* base, uint16_t index, size_t stride);
```
- `base + (index * stride)`
### 5⃣ **境界検証**
```c
int tiny_carve_guard(int slab_idx, uint16_t carved, size_t stride, uint32_t reserve);
int tiny_carve_guard_verbose(...); // Debug版詳細ログ付き
```
---
## 🔧 **修正したファイル**
### ✅ **Box 2 (Refill Dispatcher)**
- `core/hakmem_tiny_refill.inc.h`
- ❌ Before: `size_t bs = g_tiny_class_sizes[c] + ((c != 7) ? 1 : 0);` 4箇所重複
- ✅ After: `size_t bs = tiny_stride_for_class(c);`
- ❌ Before: `uint8_t* base = tiny_slab_base_for(...);`
- ✅ After: `uint8_t* base = tiny_slab_base_for_geometry(...);`
### ✅ **Box 2 - P0 Optimized Path**
- `core/hakmem_tiny_refill_p0.inc.h`
- 2箇所のstride計算を統一
- Slab base/limit計算をBox 3委譲
### ✅ **Box 4 (SuperSlab Manager)**
- `core/tiny_superslab_alloc.inc.h`
- Linear alloc, Freelist alloc, Retry pathをBox 3使用
- Debug guardsをBox 3のAPIに置き換え
### ✅ **Box 5 (SuperSlab Primitives)**
- `core/superslab/superslab_inline.h`
- `tiny_slab_base_for()` → Box 3へ委譲する薄いwrapperに変更
- 後方互換性のためwrapperは維持
---
## 🐛 **C7 (1KB) バグ修正への寄与**
### **問題**: メインパスLegacy refillでC7のみSEGV発生
### **仮説**: Box境界が曖昧だったため、C7特有の処理が漏れていた
| 処理 | Before分散 | After集約 |
|------|----------------|---------------|
| Stride計算 | 各ファイルで個別実装7箇所 | Box 3の1箇所のみ |
| Slab base計算 | 各ファイルで重複5箇所 | Box 3の1箇所のみ |
| Capacity計算 | 各ファイルで独自実施 | Box 3の1箇所のみ |
| C7 headerless処理 | `(class_idx != 7) ? 1 : 0` が散在 | Box 3で明示的に扱う |
### **期待される効果**:
1. **C7の特殊処理が明示的**になる → バグが入りにくい
2. **単一の真実の源**により、修正が1箇所で済む
3. **境界検証が統一**される → Debug時のFail-Fastが確実
---
## 📊 **コード削減効果**
- **重複コード削除**: 約80行stride/capacity/base計算の重複
- **Box 3新設**: 約200行集約+ドキュメント)
- **ネット増**: +120行可読性・保守性の大幅向上と引き換え
---
## 🚀 **次のステップ**
### **Phase 1: ビルド検証**
```bash
./build.sh release bench_fixed_size_hakmem
./build.sh debug bench_fixed_size_hakmem
```
### **Phase 2: C7デバッグ**
Box 3により、以下が容易になります
1. **Stride/Capacity計算の検証**
- `tiny_stride_for_class(7)` が正しく `1024` を返すか
- `tiny_capacity_for_slab(0, 1024)` が正しい容量を返すか
2. **Slab Base計算の検証**
- `tiny_slab_base_for_geometry(ss, 0)` が正しいオフセットを適用するか
3. **境界検証の有効化**
- Debug buildで `tiny_carve_guard_verbose()` の詳細ログ出力
### **Phase 3: Task先生によるデバッグ**
```bash
# Debug build with verbose guards
./build.sh debug bench_fixed_size_hakmem
# Run C7 with fail-fast level 2
HAKMEM_TINY_REFILL_FAILFAST=2 \
./bench_fixed_size_hakmem 200000 1024 128
```
---
## 📝 **Box理論の勝利**
### **Before (Box境界曖昧)**:
```
[ hakmem_tiny_refill.inc.h ]
├─ stride計算 × 3
├─ slab_base計算 × 3
└─ capacity計算implicit
[ tiny_superslab_alloc.inc.h ]
├─ stride計算 × 2
├─ slab_base計算 × 2
└─ capacity計算implicit
[ hakmem_tiny_refill_p0.inc.h ]
├─ stride計算 × 2
└─ slab_base計算 × 2
```
### **After (Box 3で集約)**:
```
┌─────────────────────────────┐
│ Box 3: Geometry Calculator │
│ ├─ stride_for_class() │ ← Single Source of Truth
│ ├─ capacity_for_slab() │ ← C7特殊処理を明示
│ ├─ slab_base_for_geometry()│ ← Slab 0オフセット処理
│ ├─ block_at_index() │ ← 統一されたアドレス計算
│ └─ carve_guard_verbose() │ ← Fail-Fast検証
└─────────────────────────────┘
│ (呼び出し)
┌────────┴────────┬─────────────────┬──────────────────┐
│ Box 2: Refill │ Box 2: P0 Path │ Box 4: SuperSlab │
│ (Legacy) │ (Optimized) │ Manager │
└─────────────────┴─────────────────┴──────────────────┘
```
---
## ✅ **受け入れ基準**
- [x] Box 3新設完了`core/tiny_box_geometry.h`
- [x] 全ファイルでstride/capacity/base計算をBox 3に統一
- [x] C7特殊処理headerlessがBox 3で明示的
- [ ] Release buildコンパイル成功
- [ ] Debug buildコンパイル成功
- [ ] 256B (C5) 安定性維持3/3 runs成功
- [ ] 1KB (C7) SEGV修正次フェーズ
---
**Box理論により、コードの責任境界が明確になり、C7バグのデバッグが容易になりました** 🎉