- tiny_route_env_box.h: TINY_ROUTE_SMALL_HEAP_V5 enum 追加、route snapshot で C6→v5 分岐 - malloc_tiny_fast.h: alloc/free switch に v5 case 追加(v1/pool fallback) - smallobject_hotbox_v5.c: stub 実装(alloc は NULL 返却、free は no-op) - smallobject_hotbox_v5_box.h: 関数 signature に ctx パラメータ追加 - Makefile: core/smallobject_hotbox_v5.o をリンクリストに追加 - ENV_PROFILE_PRESETS.md: v5-1 プリセット追記 - CURRENT_TASK.md: Phase v5-1 完了記録 **特性**: - ENV: HAKMEM_SMALL_HEAP_V5_ENABLED=1 / HAKMEM_SMALL_HEAP_V5_CLASSES=0x40 で opt-in - テスト結果: C6-heavy (v5 OFF 15.5M → v5 ON 16.4M ops/s, 正常), Mixed 47.2M ops/s, SEGV/assert なし - 挙動は v1/pool fallback と同じ(実装は v5-2) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
75 lines
3.0 KiB
C
75 lines
3.0 KiB
C
// tiny_route_env_box.h - Route snapshot for Tiny front (Heap vs Legacy)
|
||
// 役割:
|
||
// - 起動時に「各クラスが TinyHeap を使うか」をスナップショットし、ホットパスでは LUT 1 回に縮約する。
|
||
// - HAKMEM_TINY_HEAP_PROFILE / HAKMEM_TINY_HEAP_BOX / HAKMEM_TINY_HEAP_CLASSES の組合せをここで解決する。
|
||
#pragma once
|
||
|
||
#include <stdint.h>
|
||
#include <stdlib.h>
|
||
#include "../hakmem_tiny_config.h"
|
||
#include "tiny_heap_env_box.h"
|
||
|
||
#include "smallobject_hotbox_v3_env_box.h"
|
||
#include "smallobject_hotbox_v4_env_box.h"
|
||
#include "smallobject_v5_env_box.h"
|
||
|
||
typedef enum {
|
||
TINY_ROUTE_LEGACY = 0,
|
||
TINY_ROUTE_HEAP = 1, // TinyHeap v1
|
||
TINY_ROUTE_HOTHEAP_V2 = 2, // TinyHotHeap v2
|
||
TINY_ROUTE_SMALL_HEAP_V3 = 3, // SmallObject HotHeap v3 (C7-first,研究箱)
|
||
TINY_ROUTE_SMALL_HEAP_V4 = 4, // SmallObject HotHeap v4 (stub, route未使用)
|
||
TINY_ROUTE_SMALL_HEAP_V5 = 5, // SmallObject HotHeap v5 (C6-only route stub, Phase v5-1)
|
||
} tiny_route_kind_t;
|
||
|
||
extern tiny_route_kind_t g_tiny_route_class[TINY_NUM_CLASSES];
|
||
extern int g_tiny_route_snapshot_done;
|
||
|
||
static inline void tiny_route_snapshot_init(void) {
|
||
for (int i = 0; i < TINY_NUM_CLASSES; i++) {
|
||
// Phase v5-1: C6-only v5 route stub (before v4 check)
|
||
if (i == 6 && small_heap_v5_class_enabled(6)) {
|
||
g_tiny_route_class[i] = TINY_ROUTE_SMALL_HEAP_V5;
|
||
} else if (small_heap_v4_class_enabled((uint8_t)i)) {
|
||
g_tiny_route_class[i] = TINY_ROUTE_SMALL_HEAP_V4;
|
||
} else if (small_heap_v3_class_enabled((uint8_t)i)) {
|
||
g_tiny_route_class[i] = TINY_ROUTE_SMALL_HEAP_V3;
|
||
} else if (tiny_hotheap_v2_class_enabled((uint8_t)i)) {
|
||
g_tiny_route_class[i] = TINY_ROUTE_HOTHEAP_V2;
|
||
} else if (tiny_heap_box_enabled() && tiny_heap_class_route_enabled(i)) {
|
||
g_tiny_route_class[i] = TINY_ROUTE_HEAP;
|
||
} else {
|
||
g_tiny_route_class[i] = TINY_ROUTE_LEGACY;
|
||
}
|
||
}
|
||
g_tiny_route_snapshot_done = 1;
|
||
}
|
||
|
||
static inline tiny_route_kind_t tiny_route_for_class(uint8_t ci) {
|
||
if (__builtin_expect(!g_tiny_route_snapshot_done, 0)) {
|
||
tiny_route_snapshot_init();
|
||
}
|
||
if (__builtin_expect(ci >= TINY_NUM_CLASSES, 0)) {
|
||
return TINY_ROUTE_LEGACY;
|
||
}
|
||
return g_tiny_route_class[ci];
|
||
}
|
||
|
||
static inline int tiny_route_is_heap_kind(tiny_route_kind_t route) {
|
||
return route == TINY_ROUTE_HEAP ||
|
||
route == TINY_ROUTE_HOTHEAP_V2 ||
|
||
route == TINY_ROUTE_SMALL_HEAP_V3 ||
|
||
route == TINY_ROUTE_SMALL_HEAP_V4 ||
|
||
route == TINY_ROUTE_SMALL_HEAP_V5;
|
||
}
|
||
|
||
// C7 front が TinyHeap を使うか(Route snapshot 経由で判定)
|
||
static inline int tiny_c7_front_uses_heap(void) {
|
||
return tiny_route_is_heap_kind(tiny_route_for_class(7));
|
||
}
|
||
|
||
// C6 front が TinyHeap を使うか(Route snapshot 経由で判定)
|
||
static inline int tiny_c6_front_uses_heap(void) {
|
||
return tiny_route_is_heap_kind(tiny_route_for_class(6));
|
||
}
|