// tiny_route_box.c - Implementation of Tiny Front Routing Policy Box #include "tiny_route_box.h" #include #include #include // Default: conservative profile (all classes TINY_FIRST). // This keeps Tiny in the fast path but always allows Pool fallback. uint8_t g_tiny_route[8] = { ROUTE_TINY_FIRST, ROUTE_TINY_FIRST, ROUTE_TINY_FIRST, ROUTE_TINY_FIRST, ROUTE_TINY_FIRST, ROUTE_TINY_FIRST, ROUTE_TINY_FIRST, ROUTE_TINY_FIRST }; void tiny_route_init(void) { const char* profile = getenv("HAKMEM_TINY_PROFILE"); if (!profile || !*profile) { profile = "conservative"; } if (strcmp(profile, "hot") == 0) { // Hot profile: // - C0-C3: TINY_ONLY (小さいクラスは Tiny 専用で aggressive) // - C4-C6: TINY_FIRST (中間サイズは fallback あり) // - C7 : POOL_ONLY (1KB headerless は Pool に任せる) g_tiny_route[0] = g_tiny_route[1] = g_tiny_route[2] = g_tiny_route[3] = ROUTE_TINY_ONLY; g_tiny_route[4] = g_tiny_route[5] = g_tiny_route[6] = ROUTE_TINY_FIRST; g_tiny_route[7] = ROUTE_POOL_ONLY; } else if (strcmp(profile, "full") == 0) { // Full Tiny profile: // - 全クラス TINY_ONLY(microbench 用、Pool に逃がさない) memset(g_tiny_route, ROUTE_TINY_ONLY, sizeof(g_tiny_route)); } else if (strcmp(profile, "off") == 0) { // Tiny off profile: // - 全クラス POOL_ONLY(Tiny front 完全無効化) memset(g_tiny_route, ROUTE_POOL_ONLY, sizeof(g_tiny_route)); } else { // "conservative" および未知の値: // - 全クラス TINY_FIRST(Tiny を使うが必ず Pool fallbackあり) memset(g_tiny_route, ROUTE_TINY_FIRST, sizeof(g_tiny_route)); } #if HAKMEM_BUILD_RELEASE static int rel_logged = 0; if (!rel_logged) { const char* mode = (g_tiny_route[7] == ROUTE_TINY_ONLY) ? "TINY_ONLY" : (g_tiny_route[7] == ROUTE_TINY_FIRST) ? "TINY_FIRST" : (g_tiny_route[7] == ROUTE_POOL_ONLY) ? "POOL_ONLY" : "UNKNOWN"; fprintf(stderr, "[REL_C7_ROUTE] profile=%s route=%s\n", profile, mode); rel_logged = 1; } #endif }