Phase V6-HDR-3: SmallSegmentV6 実割り当て & RegionIdBox Registration

実装内容:
1. SmallSegmentV6のmmap割り当ては既に v6-0で実装済み
2. small_heap_ctx_v6() で segment 取得時に region_id_register_v6_segment() 呼び出し
3. region_id_v6.c に TLS スコープのセグメント登録ロジック実装:
   - 4つの static __thread 変数でセグメント情報をキャッシュ
   - region_id_register_v6_segment(): セグメント base/end を TLS に記録
   - region_id_lookup_v6(): TLS segment の range check を最初に実行
   - TLS cache 更新で O(1) lookup 実現
4. region_id_v6_box.h に SmallSegmentV6 type include & function 宣言追加
5. small_v6_region_observe_validate() に region_id_observe_lookup() 呼び出し追加

効果:
- HeaderlessデザインでRegionIdBoxが正式にSMALL_V6分類を返せるように
- TLS-scopedな簡潔な登録メカニズム (マルチスレッド対応)
- Fast path: TLS segment range check -> page_meta lookup
- Fall back path: 従来の small_page_meta_v6_of() による動的検出
- Latency: O(1) TLS cache hit rate がv6 alloc/free の大部分をカバー

🤖 Generated with Claude Code

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
Moe Charm (CI)
2025-12-11 23:51:48 +09:00
parent 406835feb3
commit df216b6901
10 changed files with 725 additions and 31 deletions

View File

@ -43,8 +43,8 @@
#include "../box/smallobject_hotbox_v3_box.h" // SmallObject HotHeap v3 skeleton
#include "../box/smallobject_hotbox_v4_box.h" // SmallObject HotHeap v4 (C7 stub)
#include "../box/smallobject_hotbox_v5_box.h" // SmallObject HotHeap v5 (C6-only route stub, Phase v5-1)
// Phase FREE-LEGACY-BREAKDOWN-1: v6 は型エラーがあるため一時的にコメントアウト(デフォルト OFF なので影響なし)
// #include "../box/smallobject_core_v6_box.h" // SmallObject Core v6 (C6-only route stub, Phase v6-1)
#include "../box/smallobject_core_v6_box.h" // SmallObject Core v6 (Phase V6-HDR-2)
#include "../box/smallobject_v6_env_box.h" // SmallObject v6 ENV control (Phase V6-HDR-2)
#include "../box/tiny_c7_ultra_box.h" // C7 ULTRA stub (UF-1, delegates to v3)
#include "../box/tiny_c6_ultra_free_box.h" // Phase 4-2: C6 ULTRA-free (free-only, C6-only)
#include "../box/tiny_c5_ultra_free_box.h" // Phase 5-1/5-2: C5 ULTRA-free + alloc integration
@ -224,9 +224,15 @@ static inline void* malloc_tiny_fast(size_t size) {
switch (route) {
case TINY_ROUTE_SMALL_HEAP_V6: {
// Phase FREE-LEGACY-BREAKDOWN-1: v6 は既存のビルドエラーがあるため一時的にスキップ
// (v6 はデフォルト OFF なので測定には影響なし)
// fallthrough to v5/v2/v1
// Phase V6-HDR-2: Headerless alloc (ENV gated)
if (small_v6_headerless_route_enabled((uint8_t)class_idx)) {
SmallHeapCtxV6* ctx_v6 = small_heap_ctx_v6();
void* v6p = small_v6_headerless_alloc(ctx_v6, (uint8_t)class_idx);
if (TINY_HOT_LIKELY(v6p != NULL)) {
return v6p; // No header write needed - done in refill
}
// v6 returned NULL -> fallback to legacy
}
__attribute__((fallthrough));
}
case TINY_ROUTE_SMALL_HEAP_V3: {
@ -459,10 +465,15 @@ static inline int free_tiny_fast(void* ptr) {
if (__builtin_expect(use_tiny_heap, 0)) {
switch (route) {
case TINY_ROUTE_SMALL_HEAP_V6: {
// Phase FREE-LEGACY-BREAKDOWN-1: v6 は既存のビルドエラーがあるため、今回は skip
// (v6 はデフォルト OFF なので測定には影響なし)
// fallthrough to v5/v2/v1
break;
// Phase V6-HDR-2: Headerless free (ENV gated)
if (small_v6_headerless_route_enabled((uint8_t)class_idx)) {
SmallHeapCtxV6* ctx_v6 = small_heap_ctx_v6();
if (small_v6_headerless_free(ctx_v6, ptr, (uint8_t)class_idx)) {
return 1; // Handled by v6
}
// v6 returned false -> fallback to legacy
}
break; // fallthrough to legacy
}
case TINY_ROUTE_SMALL_HEAP_V5: {
// Phase v5-2: C6-only full implementation