// front_gate_box.c - Front Gate Box (SFC/SLL priority and helpers) #include "front_gate_box.h" #include "tiny_alloc_fast_sfc.inc.h" // TLS SLL state (extern from hakmem_tiny.c) extern __thread void* g_tls_sll_head[TINY_NUM_CLASSES]; extern __thread uint32_t g_tls_sll_count[TINY_NUM_CLASSES]; extern int g_tls_sll_enable; // set at init via HAKMEM_TINY_TLS_SLL // Front breakdown counters (extern from hakmem_tiny.c) extern unsigned long long g_front_sfc_hit[]; extern unsigned long long g_front_sll_hit[]; // SFC feature flag (extern from hakmem_tiny_sfc.c) extern int g_sfc_enabled; int front_gate_try_pop(int class_idx, void** out_ptr) { if (!out_ptr) return 0; // Layer 0: SFC if (__builtin_expect(g_sfc_enabled, 1)) { void* p = sfc_alloc(class_idx); if (p != NULL) { g_front_sfc_hit[class_idx]++; *out_ptr = p; return 1; } } // Layer 1: TLS SLL if (__builtin_expect(g_tls_sll_enable, 1)) { void* head = g_tls_sll_head[class_idx]; if (__builtin_expect(head != NULL, 1)) { g_front_sll_hit[class_idx]++; g_tls_sll_head[class_idx] = *(void**)head; // pop if (g_tls_sll_count[class_idx] > 0) g_tls_sll_count[class_idx]--; *out_ptr = head; return 1; } } return 0; } // Cascade some of refilled blocks into SFC (one-way, safe) void front_gate_after_refill(int class_idx, int refilled_count) { if (!g_sfc_enabled || refilled_count <= 0) return; int to_move = refilled_count / 2; if (to_move <= 0) return; while (to_move-- > 0 && g_tls_sll_count[class_idx] > 0) { // SLL pop void* ptr = g_tls_sll_head[class_idx]; if (!ptr) break; g_tls_sll_head[class_idx] = *(void**)ptr; g_tls_sll_count[class_idx]--; // SFC push (capacity-guarded inside sfc_free_push) if (!sfc_free_push(class_idx, ptr)) { // If SFC refused (full), stop early to avoid spinning break; } } } void front_gate_push_tls(int class_idx, void* ptr) { *(void**)ptr = g_tls_sll_head[class_idx]; g_tls_sll_head[class_idx] = ptr; g_tls_sll_count[class_idx]++; }