// smallobject_v5_env_box.h - SmallObject v5 環境ゲート(Phase v5-0) // // ENV ベース: HAKMEM_SMALL_HEAP_V5_ENABLED, HAKMEM_SMALL_HEAP_V5_CLASSES #ifndef HAKMEM_SMALLOBJECT_V5_ENV_BOX_H #define HAKMEM_SMALLOBJECT_V5_ENV_BOX_H #include #include #include // 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 = 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') ? ENV_ENABLED : ENV_DISABLED; } return (g_enabled == ENV_ENABLED); } // small_heap_v5_class_mask() - v5 対象クラスのビットマスク static inline uint32_t small_heap_v5_class_mask(void) { 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 = (int)strtoul(e, NULL, 0); } else { g_mask = 0x0; // default: OFF } } return (uint32_t)g_mask; } // small_heap_v5_class_enabled() - 指定クラスが v5 有効か static inline int small_heap_v5_class_enabled(uint32_t class_idx) { if (class_idx >= 8) return 0; if (!small_heap_v5_enabled()) return 0; uint32_t mask = small_heap_v5_class_mask(); return (mask & (1u << class_idx)) ? 1 : 0; } // 便利関数 static inline int small_heap_v5_c6_enabled(void) { return small_heap_v5_class_enabled(6); } static inline int small_heap_v5_c5_enabled(void) { return small_heap_v5_class_enabled(5); } 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