diff --git a/core/superslab_backend.c b/core/superslab_backend.c index be8db45d..f465f462 100644 --- a/core/superslab_backend.c +++ b/core/superslab_backend.c @@ -212,9 +212,14 @@ void* hak_tiny_alloc_superslab_backend_shared(int class_idx) * Box API entry: * - Single front-door for tiny-side Superslab allocations. * - * Phase 12 policy: - * - HAKMEM_TINY_SS_SHARED=0 → legacy backendのみ(回帰確認用) - * - HAKMEM_TINY_SS_SHARED=1 → shared backendを優先し、失敗時のみ legacy にフォールバック + * Phase 9-2 Root Fix: Shared Pool backend unified mode (default ON) + * Policy: + * - HAKMEM_TINY_SS_SHARED=2 (default) → Shared Pool backend ONLY (no legacy fallback) + * - HAKMEM_TINY_SS_SHARED=1 → Shared Pool backend with legacy fallback (testing mode) + * - HAKMEM_TINY_SS_SHARED=0 → Legacy backend only (compatibility mode) + * + * Root Cause: Legacy backend (g_superslab_heads) has TLS_SLL_DUP issue + * Solution: Disable legacy backend by default, keep as "reversible box" via env var */ void* hak_tiny_alloc_superslab_box(int class_idx) { @@ -223,13 +228,37 @@ void* hak_tiny_alloc_superslab_box(int class_idx) if (__builtin_expect(g_ss_shared_mode == -1, 0)) { const char* e = getenv("HAKMEM_TINY_SS_SHARED"); if (!e || !*e) { - g_ss_shared_mode = 1; // デフォルト: shared 有効 + g_ss_shared_mode = 2; // Phase 9-2 Root Fix: Shared Pool ONLY (no legacy fallback) } else { int v = atoi(e); - g_ss_shared_mode = (v != 0) ? 1 : 0; + g_ss_shared_mode = v; // 0=legacy only, 1=shared+fallback, 2=shared only } +#if !HAKMEM_BUILD_RELEASE + const char* mode_str = (g_ss_shared_mode == 2) ? "shared_only" : + (g_ss_shared_mode == 1) ? "shared+fallback" : "legacy_only"; + fprintf(stderr, "[SS_BACKEND] Mode: %s (HAKMEM_TINY_SS_SHARED=%d)\n", mode_str, g_ss_shared_mode); +#endif } + // Mode 2: Shared Pool ONLY (default, no legacy fallback) + if (g_ss_shared_mode == 2) { + void* p = hak_tiny_alloc_superslab_backend_shared(class_idx); + if (p != NULL) { + uint32_t n = atomic_fetch_add_explicit(&g_ss_backend_log, 1, memory_order_relaxed); + if (n < 4) { + fprintf(stderr, "[SS_BACKEND] shared_only cls=%d ptr=%p\n", class_idx, p); + } + return p; + } + // Phase 9-2: NO fallback to legacy - return NULL on failure + uint32_t n = atomic_fetch_add_explicit(&g_ss_backend_log, 1, memory_order_relaxed); + if (n < 4) { + fprintf(stderr, "[SS_BACKEND] shared_fail→NULL (no legacy) cls=%d\n", class_idx); + } + return NULL; + } + + // Mode 1: Shared Pool with legacy fallback (testing mode) if (g_ss_shared_mode == 1) { void* p = hak_tiny_alloc_superslab_backend_shared(class_idx); if (p != NULL) { @@ -239,7 +268,7 @@ void* hak_tiny_alloc_superslab_box(int class_idx) } return p; } - // shared backend が失敗した場合は安全側で legacy にフォールバック + // Fallback to legacy uint32_t n = atomic_fetch_add_explicit(&g_ss_backend_log, 1, memory_order_relaxed); if (n < 4) { fprintf(stderr, "[SS_BACKEND] shared_fail→legacy cls=%d\n", class_idx); @@ -247,7 +276,7 @@ void* hak_tiny_alloc_superslab_box(int class_idx) return hak_tiny_alloc_superslab_backend_legacy(class_idx); } - // shared OFF 時は legacy のみ + // Mode 0: Legacy backend only (compatibility mode) uint32_t n = atomic_fetch_add_explicit(&g_ss_backend_log, 1, memory_order_relaxed); if (n < 4) { fprintf(stderr, "[SS_BACKEND] legacy cls=%d\n", class_idx);