# Current Task – 2025-11-08 ## ✅ 完了: 二重割り当てバグの修正 ### 根本原因 `trc_linear_carve()` が `meta->used` をカーソルとして使用していたが、`meta->used` はブロック解放時に減少するため、既に割り当て済みのブロックが再度カーブされる**二重割り当てバグ**が発生していた。 ### 発見プロセス 1. Fail-Fast 診断ログで TLS SLL head の破壊を検出 (`0x...fcf1` = 241バイトの misalignment) 2. 配布ポインタの next 読み取り時にユーザーデータ (`0x6261` = ASCII "ab") を検出 3. ログ解析で同じブロック (offset 0xFC00 = 64512) が 2回割り当てられていることを確認 4. LINEAR_CARVE ログで `used=61 batch=1` → `used=59 batch=3` の矛盾を発見 ### 証拠ログ ``` [LINEAR_CARVE] base=0x...600800 used=61 batch=1 → ブロック 61 を作成 (いくつかのブロックが解放され、used が 62 → 59 に減少) [LINEAR_CARVE] base=0x...600800 used=59 batch=3 → ブロック 59, 60, 61 を再作成! ``` ### 実装した修正 **1. `TinySlabMeta` 構造体に `carved` フィールド追加** (`core/superslab/superslab_types.h`) ```c typedef struct TinySlabMeta { void* freelist; uint16_t used; // 現在使用中のブロック数(増減両方) uint16_t capacity; uint16_t carved; // 線形領域からカーブしたブロック数(単調増加のみ) uint16_t owner_tid; // uint32_t → uint16_t に変更 } TinySlabMeta; ``` **2. `trc_linear_carve()` を修正** (`core/tiny_refill_opt.h`) ```c // Before: meta->used をカーソルとして使用(バグ!) uint8_t* cursor = base + ((size_t)meta->used * bs); meta->used += batch; // After: meta->carved をカーソルとして使用(修正版) uint8_t* cursor = base + ((size_t)meta->carved * bs); meta->carved += batch; // 単調増加のみ meta->used += batch; // 使用中カウントも更新 ``` **3. 初期化コード追加** (`core/hakmem_tiny_superslab.c`) ```c meta->carved = 0; // carved カウンター初期化 meta->owner_tid = (uint16_t)owner_tid; // uint16_t にキャスト ``` ### テスト結果 ```bash # Fail-fast モード(診断ログあり) HAKMEM_TINY_REFILL_FAILFAST=2 ./bench_random_mixed_hakmem 50000 2048 1234567 → ✅ 651,627 ops/s (クラッシュなし) # 通常モード(診断ログなし) ./bench_random_mixed_hakmem 50000 2048 1234567 → ✅ 950,037 ops/s (クラッシュなし) ``` ### 修正されたファイル - `core/superslab/superslab_types.h` - `TinySlabMeta` に `carved` フィールド追加 - `core/tiny_refill_opt.h` - `trc_linear_carve()` を `carved` 使用に修正 - `core/hakmem_tiny_superslab.c` - `carved` 初期化 - `core/tiny_alloc_fast.inc.h` - 診断ログ追加 (次ポインタ検証) - `core/hakmem_tiny_free.inc` - 診断ログ追加 (drain/free 検証) ## 次のステップ 1. **診断ログのクリーンアップ** (Optional) - Fail-Fast ログを本番向けに最適化 - デバッグ用のログを削除 2. **性能ベンチマーク** - `bench_random_mixed` でスループット計測 - Larson ベンチマークで検証 - System/mimalloc との比較 3. **追加テスト** - マルチスレッドストレステスト - 長時間実行テスト ## 実行コマンド ```bash # 通常テスト HAKMEM_TINY_USE_SUPERSLAB=1 ./bench_random_mixed_hakmem 50000 2048 1234567 # Fail-fast 診断モード HAKMEM_TINY_REFILL_FAILFAST=2 HAKMEM_TINY_USE_SUPERSLAB=1 \ ./bench_random_mixed_hakmem 50000 2048 1234567 ```