Files
hakmem/core/hakmem_tiny_bump.inc.h

108 lines
3.4 KiB
C
Raw Normal View History

// hakmem_tiny_bump.inc.h
// Layer 1: TLS Bump Allocator (Ultra-fast path)
//
// Purpose: 2-3 instruction allocation for hot classes (8B, 16B, 32B)
// Design: bcur += size; if (bcur <= bend) return old;
//
// Part of 3-layer architecture simplification (2025-11-01)
// Based on ChatGPT Pro UltraThink recommendations
#ifndef HAKMEM_TINY_BUMP_INC_H
#define HAKMEM_TINY_BUMP_INC_H
// likely/unlikely macros
#ifndef likely
#define likely(x) __builtin_expect(!!(x), 1)
#endif
#ifndef unlikely
#define unlikely(x) __builtin_expect(!!(x), 0)
#endif
// ============================================================================
// Data Structure
// ============================================================================
typedef struct {
void* bcur; // Current bump pointer
void* bend; // Bump end (exclusive)
} TinyBump;
// Per-class bump allocator (hot classes only: class 0, 1, 2 = 8B, 16B, 32B)
static __thread TinyBump g_tiny_bump[3] = {{NULL, NULL}, {NULL, NULL}, {NULL, NULL}};
// ============================================================================
// Layer 1: Ultra-fast bump allocation (2-3 instructions/op)
// ============================================================================
// Class 0: 8B
__attribute__((always_inline))
static inline void* tiny_bump_alloc_8B(void) {
void* old = g_tiny_bump[0].bcur;
void* new_cur = (char*)old + 8;
if (likely(new_cur <= g_tiny_bump[0].bend)) {
g_tiny_bump[0].bcur = new_cur;
return old;
}
return NULL; // Exhausted, fallback to Layer 2
}
// Class 1: 16B
__attribute__((always_inline))
static inline void* tiny_bump_alloc_16B(void) {
void* old = g_tiny_bump[1].bcur;
void* new_cur = (char*)old + 16;
if (likely(new_cur <= g_tiny_bump[1].bend)) {
g_tiny_bump[1].bcur = new_cur;
return old;
}
return NULL; // Exhausted, fallback to Layer 2
}
// Class 2: 32B
__attribute__((always_inline))
static inline void* tiny_bump_alloc_32B(void) {
void* old = g_tiny_bump[2].bcur;
void* new_cur = (char*)old + 32;
if (likely(new_cur <= g_tiny_bump[2].bend)) {
g_tiny_bump[2].bcur = new_cur;
return old;
}
return NULL; // Exhausted, fallback to Layer 2
}
// Generic bump alloc (for use in slow path)
__attribute__((always_inline))
static inline void* tiny_bump_alloc(int class_idx) {
if (class_idx == 0) return tiny_bump_alloc_8B();
if (class_idx == 1) return tiny_bump_alloc_16B();
if (class_idx == 2) return tiny_bump_alloc_32B();
return NULL; // Not a hot class
}
// ============================================================================
// Bump refill (called from Layer 3: slow path)
// ============================================================================
__attribute__((noinline))
static void tiny_bump_refill(int class_idx, void* base, size_t size) {
if (class_idx < 0 || class_idx > 2) return; // Only hot classes
g_tiny_bump[class_idx].bcur = base;
g_tiny_bump[class_idx].bend = (char*)base + size;
}
// Reset bump allocator (e.g., thread shutdown)
static void tiny_bump_reset(int class_idx) {
if (class_idx < 0 || class_idx > 2) return;
g_tiny_bump[class_idx].bcur = NULL;
g_tiny_bump[class_idx].bend = NULL;
}
// Reset all bump allocators
static void tiny_bump_reset_all(void) {
for (int i = 0; i < 3; i++) {
tiny_bump_reset(i);
}
}
#endif // HAKMEM_TINY_BUMP_INC_H