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>
This commit is contained in:
Moe Charm (CI)
2025-12-11 03:19:18 +09:00
parent 83d4096fbc
commit dedfea27d5
4 changed files with 128 additions and 25 deletions

View File

@ -7,29 +7,42 @@
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
// ENV sentinel values
#define ENV_UNINIT (-1)
#define ENV_ENABLED (1)
#define ENV_DISABLED (0)
// route priority enum
enum small_route_priority {
ROUTE_PRIORITY_V4 = 0,
ROUTE_PRIORITY_V5 = 1,
ROUTE_PRIORITY_AUTO = 2,
};
// small_heap_v5_enabled() - グローバル v5 enable check
static inline int small_heap_v5_enabled(void) {
static int g_enabled = -1;
if (g_enabled == -1) {
static int g_enabled = ENV_UNINIT;
if (__builtin_expect(g_enabled == ENV_UNINIT, 0)) {
const char* e = getenv("HAKMEM_SMALL_HEAP_V5_ENABLED");
g_enabled = (e && *e && *e != '0') ? 1 : 0;
g_enabled = (e && *e && *e != '0') ? ENV_ENABLED : ENV_DISABLED;
}
return g_enabled;
return (g_enabled == ENV_ENABLED);
}
// small_heap_v5_class_mask() - v5 対象クラスのビットマスク
static inline uint32_t small_heap_v5_class_mask(void) {
static uint32_t g_mask = (uint32_t)-1; // sentinel
if (g_mask == (uint32_t)-1) {
static int g_mask = ENV_UNINIT; // sentinel
if (__builtin_expect(g_mask == ENV_UNINIT, 0)) {
const char* e = getenv("HAKMEM_SMALL_HEAP_V5_CLASSES");
if (e && *e) {
g_mask = (uint32_t)strtoul(e, NULL, 0);
g_mask = (int)strtoul(e, NULL, 0);
} else {
g_mask = 0x0; // default: OFF
}
}
return g_mask;
return (uint32_t)g_mask;
}
// small_heap_v5_class_enabled() - 指定クラスが v5 有効か
@ -53,4 +66,46 @@ static inline int small_heap_v5_c7_enabled(void) {
return small_heap_v5_class_enabled(7);
}
// small_route_priority() - route priority (v4/v5/auto)
// ENV: HAKMEM_ROUTE_PRIORITY={v4|v5|auto}, default: v4
static inline int small_route_priority(void) {
static int g_priority = ENV_UNINIT;
if (__builtin_expect(g_priority == ENV_UNINIT, 0)) {
const char* e = getenv("HAKMEM_ROUTE_PRIORITY");
if (e && *e) {
if (strcmp(e, "v5") == 0) {
g_priority = ROUTE_PRIORITY_V5;
} else if (strcmp(e, "auto") == 0) {
g_priority = ROUTE_PRIORITY_AUTO;
} else {
g_priority = ROUTE_PRIORITY_V4; // default or "v4"
}
} else {
g_priority = ROUTE_PRIORITY_V4; // default
}
}
return g_priority;
}
// small_heap_v5_segment_size() - segment size override
// ENV: HAKMEM_SMALL_HEAP_V5_SEGMENT_SIZE, default: 2MiB (2*1024*1024)
static inline size_t small_heap_v5_segment_size(void) {
static int g_size = ENV_UNINIT;
if (__builtin_expect(g_size == ENV_UNINIT, 0)) {
const char* e = getenv("HAKMEM_SMALL_HEAP_V5_SEGMENT_SIZE");
if (e && *e) {
size_t sz = (size_t)strtoul(e, NULL, 0);
// validate: must be power of 2, >= 64KiB
if (sz >= (64 * 1024) && (sz & (sz - 1)) == 0) {
g_size = (int)sz;
} else {
g_size = (2 * 1024 * 1024); // fallback to default
}
} else {
g_size = (2 * 1024 * 1024); // default: 2MiB
}
}
return (size_t)g_size;
}
#endif // HAKMEM_SMALLOBJECT_V5_ENV_BOX_H