- ENV initialization を sentinel パターンで統一
- ENV_UNINIT/ENABLED/DISABLED 定数追加
- __builtin_expect で初期化チェックを最適化
- small_heap_v5_enabled/class_mask を統一パターンに変更
- ポインタマクロ化(O(1) segment/page 計算)
- SMALL_SEGMENT_V5_BASE_FROM_PTR: ptr から segment base を mask で計算
- SMALL_SEGMENT_V5_PAGE_IDX: segment 内の page_idx を shift で計算
- SMALL_SEGMENT_V5_PAGE_META: page_meta への O(1) access(bounds check付き)
- SMALL_SEGMENT_V5_VALIDATE_MAGIC: magic 検証
- SMALL_SEGMENT_V5_VALIDATE_PTR: Fail-Fast validation pipeline
- SmallClassHeapV5 に partial_count 追加
- partial ページリストのカウンタを追加(refill/retire 最適化用)
- SmallPageMetaV5 の field 再配置(L1 cache 最適化)
- hot fields (free_list, used, capacity) を先頭に集約
- metadata (class_idx, flags, page_idx, segment) を後方配置
- total 24B、offset コメント追加
- route priority ENV 追加
- HAKMEM_ROUTE_PRIORITY={v4|v5|auto}(default: v4)
- enum small_route_priority 定義
- small_route_priority() 関数追加
- segment_size override ENV 追加
- HAKMEM_SMALL_HEAP_V5_SEGMENT_SIZE(default: 2MiB)
- power of 2 & >= 64KiB validation
挙動: 完全不変(v5 route は呼ばれない、ENV default OFF)
テスト: Mixed 16–1024B で 43.0–43.8M ops/s(変化なし)、SEGV/assert なし
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
74 lines
3.0 KiB
C
74 lines
3.0 KiB
C
// smallsegment_v5_box.h - SmallSegment v5(Phase v5-0)
|
||
//
|
||
// 2MiB Segment / 64KiB Page ベースの O(1) page_meta lookup
|
||
|
||
#ifndef HAKMEM_SMALLSEGMENT_V5_BOX_H
|
||
#define HAKMEM_SMALLSEGMENT_V5_BOX_H
|
||
|
||
#include <stdint.h>
|
||
#include "smallobject_hotbox_v5_box.h"
|
||
|
||
#define SMALL_SEGMENT_V5_SIZE (2 * 1024 * 1024) // 2 MiB
|
||
#define SMALL_SEGMENT_V5_PAGE_SIZE (64 * 1024) // 64 KiB
|
||
#define SMALL_SEGMENT_V5_NUM_PAGES (SMALL_SEGMENT_V5_SIZE / SMALL_SEGMENT_V5_PAGE_SIZE) // 32
|
||
#define SMALL_SEGMENT_V5_MAGIC 0xDEADBEEF
|
||
#define SMALL_SEGMENT_V5_PAGE_SHIFT 16 // log2(64KiB)
|
||
|
||
// ポインタマクロ - O(1) segment/page 計算
|
||
|
||
// SMALL_SEGMENT_V5_BASE_FROM_PTR(ptr) - ptr から segment base を mask で計算
|
||
#define SMALL_SEGMENT_V5_BASE_FROM_PTR(ptr) \
|
||
((SmallSegmentV5*)((uintptr_t)(ptr) & ~(SMALL_SEGMENT_V5_SIZE - 1)))
|
||
|
||
// SMALL_SEGMENT_V5_PAGE_IDX(seg, ptr) - segment 内の page_idx を shift で計算
|
||
#define SMALL_SEGMENT_V5_PAGE_IDX(seg, ptr) \
|
||
(((uintptr_t)(ptr) - (uintptr_t)(seg)->base) >> SMALL_SEGMENT_V5_PAGE_SHIFT)
|
||
|
||
// SMALL_SEGMENT_V5_PAGE_META(seg, ptr) - page_meta への O(1) access(bounds check付き)
|
||
#define SMALL_SEGMENT_V5_PAGE_META(seg, ptr) \
|
||
({ \
|
||
SmallSegmentV5* _seg = (seg); \
|
||
if (__builtin_expect(!_seg, 0)) { \
|
||
(SmallPageMetaV5*)NULL; \
|
||
} else { \
|
||
size_t _idx = SMALL_SEGMENT_V5_PAGE_IDX(_seg, (ptr)); \
|
||
(__builtin_expect(_idx < _seg->num_pages, 1)) ? \
|
||
&_seg->page_meta[_idx] : (SmallPageMetaV5*)NULL; \
|
||
} \
|
||
})
|
||
|
||
// SMALL_SEGMENT_V5_VALIDATE_MAGIC(seg) - magic 検証
|
||
#define SMALL_SEGMENT_V5_VALIDATE_MAGIC(seg) \
|
||
(__builtin_expect((seg) && (seg)->magic == SMALL_SEGMENT_V5_MAGIC, 1))
|
||
|
||
// SMALL_SEGMENT_V5_VALIDATE_PTR(ptr) - Fail-Fast validation pipeline
|
||
// ptr が valid な v5 segment 内にあるかを検証
|
||
#define SMALL_SEGMENT_V5_VALIDATE_PTR(ptr) \
|
||
({ \
|
||
int _valid = 0; \
|
||
if (__builtin_expect((ptr) != NULL, 1)) { \
|
||
SmallSegmentV5* _seg = SMALL_SEGMENT_V5_BASE_FROM_PTR(ptr); \
|
||
if (SMALL_SEGMENT_V5_VALIDATE_MAGIC(_seg)) { \
|
||
size_t _idx = SMALL_SEGMENT_V5_PAGE_IDX(_seg, (ptr)); \
|
||
_valid = (_idx < _seg->num_pages); \
|
||
} \
|
||
} \
|
||
_valid; \
|
||
})
|
||
|
||
// SmallSegmentV5: セグメント構造体
|
||
typedef struct SmallSegmentV5 {
|
||
uintptr_t base; // セグメント先頭アドレス
|
||
uint32_t num_pages; // ページ数(通常は 32)
|
||
uint32_t owner_tid; // オーナースレッド ID
|
||
uint32_t magic; // 0xDEADBEEF for validation
|
||
SmallPageMetaV5 page_meta[SMALL_SEGMENT_V5_NUM_PAGES]; // page metadata array
|
||
} SmallSegmentV5;
|
||
|
||
// API(v5-0 では宣言のみ、実装は v5-2)
|
||
SmallSegmentV5* small_segment_v5_acquire(void);
|
||
void small_segment_v5_release(SmallSegmentV5* seg);
|
||
SmallPageMetaV5* small_segment_v5_page_meta_of(void* ptr);
|
||
|
||
#endif // HAKMEM_SMALLSEGMENT_V5_BOX_H
|