MID-V3-6: hakmem.c integration (box modularization)
Integrate MID/Pool v3 into hakmem.c main allocation path using box modularization pattern. Changes: - core/hakmem.c: Include MID v3 headers - core/box/hak_alloc_api.inc.h: Add v3 allocation gate - C6 (145-256B) and C7 (769-1024B) size classes - ENV opt-in via HAKMEM_MID_V3_ENABLED + HAKMEM_MID_V3_CLASSES - Priority: v6 > v3 > v4 > pool - core/box/hak_free_api.inc.h: Add v3 free path - RegionIdBox lookup based ownership check - Makefile: Add core/mid_hotbox_v3.o to TINY_BENCH_OBJS_BASE ENV controls (default OFF): HAKMEM_MID_V3_ENABLED=1 HAKMEM_MID_V3_CLASSES=0x40 (C6) HAKMEM_MID_V3_CLASSES=0x80 (C7) HAKMEM_MID_V3_DEBUG=1 Verified with bench_mid_large_mt_hakmem (7-9M ops/s, no crashes) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -9,6 +9,8 @@
|
||||
#include "tiny_heap_env_box.h" // TinyHeap front gate (C7 / multi-class)
|
||||
#include "tiny_heap_box.h" // TinyHeapBox alloc/free helpers
|
||||
#include "tiny_c7_hotbox.h" // tiny_c7_alloc_fast wrapper
|
||||
#include "mid_hotbox_v3_box.h" // Phase MID-V3: Mid/Pool HotBox v3 types
|
||||
#include "mid_hotbox_v3_env_box.h" // Phase MID-V3: ENV gate for v3
|
||||
|
||||
#ifdef HAKMEM_POOL_TLS_PHASE1
|
||||
#include "../pool_tls.h"
|
||||
@ -68,6 +70,52 @@ inline void* hak_alloc_at(size_t size, hak_callsite_t site) {
|
||||
// TLS miss: Fall through to Mid/ACE (Tiny skipped due to auto-adjust)
|
||||
}
|
||||
|
||||
// =========================================================================
|
||||
// Phase MID-V3: Mid/Pool HotBox v3 (256B-1KB, opt-in via ENV)
|
||||
// =========================================================================
|
||||
// Priority: v6 → v3 → v4 → pool (ENV-controlled routing)
|
||||
// ENV: HAKMEM_MID_V3_ENABLED=1 HAKMEM_MID_V3_CLASSES=0x40 (C6 only)
|
||||
// Design: TLS lane cache with page-based allocation, RegionIdBox integration
|
||||
// NOTE: Must come BEFORE Tiny to intercept specific size classes
|
||||
if (__builtin_expect(mid_v3_enabled() && size >= 256 && size <= 1024, 0)) {
|
||||
static _Atomic int entry_log_count = 0;
|
||||
if (mid_v3_debug_enabled() && atomic_fetch_add(&entry_log_count, 1) < 3) {
|
||||
fprintf(stderr, "[MID_V3] Entered v3 path: size=%zu\n", size);
|
||||
}
|
||||
|
||||
int class_idx = -1;
|
||||
// C6: 256B class handles sizes up to 256B (145-256B range)
|
||||
// C7: 1024B class handles sizes up to 1024B (769-1024B range)
|
||||
if (size > 144 && size <= 256 && mid_v3_class_enabled(6)) {
|
||||
class_idx = 6; // C6: 256B
|
||||
} else if (size > 768 && size <= 1024 && mid_v3_class_enabled(7)) {
|
||||
class_idx = 7; // C7: 1024B
|
||||
}
|
||||
|
||||
if (mid_v3_debug_enabled() && class_idx >= 0) {
|
||||
static _Atomic int class_log_count = 0;
|
||||
if (atomic_fetch_add(&class_log_count, 1) < 3) {
|
||||
fprintf(stderr, "[MID_V3] Class selected: size=%zu class=%d\n", size, class_idx);
|
||||
}
|
||||
}
|
||||
|
||||
if (class_idx >= 0) {
|
||||
MidHotBoxV3* hot = mid_hot_box_v3_get();
|
||||
void* v3_ptr = mid_hot_v3_alloc(hot, class_idx);
|
||||
if (__builtin_expect(v3_ptr != NULL, 1)) {
|
||||
if (mid_v3_debug_enabled()) {
|
||||
static _Atomic int alloc_log_count = 0;
|
||||
if (atomic_fetch_add(&alloc_log_count, 1) < 10) {
|
||||
fprintf(stderr, "[MID_V3] Alloc: size=%zu class=%d ptr=%p\n",
|
||||
size, class_idx, v3_ptr);
|
||||
}
|
||||
}
|
||||
hkm_ace_track_alloc();
|
||||
return v3_ptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Phase 16: Dynamic Tiny max size (ENV: HAKMEM_TINY_MAX_CLASS)
|
||||
// Default: 1023B (C0-C7), reduced to 255B (C0-C5) when Small-Mid enabled
|
||||
// Phase 17-1: Auto-adjusted to avoid overlap with Small-Mid
|
||||
|
||||
Reference in New Issue
Block a user