Files
hakmem/core/box/smallsegment_v5_box.h
Moe Charm (CI) dedfea27d5 Phase v5-0 refactor: ENV統一・マクロ化・構造体最適化
- 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>
2025-12-11 03:19:18 +09:00

74 lines
3.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

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.

// smallsegment_v5_box.h - SmallSegment v5Phase 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) accessbounds 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;
// APIv5-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