Files
hakmem/core/box/smallsegment_v5_box.h
Moe Charm (CI) e0fb7d550a Phase v5-2: SmallObject v5 C6-only 本実装 (WIP - header fix)
本実装修正:
- tiny_region_id_write_header() を追加: USER pointer を正しく返す
- TLS slot からの segment 探索 (page_meta_of)
- Page-level allocation で segment 再利用
- 2MiB alignment 保証 (4MiB 確保 + alignment)
- free パスの route 修正 (v4 から v5 への fallthrough 削除)

動作確認:
- SEGV 消失: alloc/free 基本動作 OK
- 性能: ~18-20M ops/s (baseline 43-47M の約 40-45%)
- 回帰原因: TLS slot 線形探索 O(n)、find_page O(n)

残タスク:
- O(1) segment lookup 最適化 (hash または array 直接参照)
- find_page 除去 (segment lookup 成功時)
- partial_count/list 管理の最適化

ENV デフォルト OFF なので本線影響なし。

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-11 04:14:51 +09:00

78 lines
3.2 KiB
C
Raw Permalink 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);
// Page-level allocation (v5-2 fix for segment reuse)
SmallPageMetaV5* small_segment_v5_alloc_page(void);
void small_segment_v5_free_page(SmallPageMetaV5* page);
#endif // HAKMEM_SMALLSEGMENT_V5_BOX_H