Files
hakmem/core/box/front_gate_box.c

74 lines
2.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// front_gate_box.c - Front Gate Box (SFC/SLL priority and helpers)
#include "front_gate_box.h"
#include "tiny_alloc_fast_sfc.inc.h"
#include "tls_sll_box.h" // Box TLS-SLL API
// 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 = NULL;
if (tls_sll_pop(class_idx, &head)) {
g_front_sll_hit[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 = NULL;
if (!tls_sll_pop(class_idx, &ptr)) break;
// 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) {
// Normalize to base for header classes (C0C6)
void* base = (class_idx == 7) ? ptr : (void*)((uint8_t*)ptr - 1);
// Use Box TLS-SLL API (C7-safe; expects base pointer)
if (!tls_sll_push(class_idx, base, UINT32_MAX)) {
// C7 rejected or capacity exceeded - should not happen in front gate
// but handle gracefully (silent discard)
return;
}
}