P1.3: Add meta->active for TLS SLL tracking
Add active field to TinySlabMeta to track blocks currently held by users (not in TLS SLL or freelist caches). This enables accurate empty slab detection that accounts for TLS SLL cached blocks. Changes: - superslab_types.h: Add _Atomic uint16_t active field - ss_allocation_box.c, hakmem_tiny_superslab.c: Initialize active=0 - tiny_free_fast_v2.inc.h: Decrement active on TLS SLL push - tiny_alloc_fast.inc.h: Add tiny_active_track_alloc() helper, increment active on TLS SLL pop (all code paths) - ss_hot_cold_box.h: ss_is_slab_empty() uses active when enabled All tracking is ENV-gated: HAKMEM_TINY_ACTIVE_TRACK=1 to enable. Default is off for zero performance impact. Invariant: active = used - tls_cached (active <= used) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -329,6 +329,27 @@ static inline int hak_tiny_free_fast_v2(void* ptr) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// P1.3: Decrement meta->active when block is freed (user gives it back)
|
||||
// ENV gate: HAKMEM_TINY_ACTIVE_TRACK=1 to enable (default: 0 for performance)
|
||||
{
|
||||
static __thread int g_active_track = -1;
|
||||
if (__builtin_expect(g_active_track == -1, 0)) {
|
||||
const char* e = getenv("HAKMEM_TINY_ACTIVE_TRACK");
|
||||
g_active_track = (e && *e && *e != '0') ? 1 : 0;
|
||||
}
|
||||
if (__builtin_expect(g_active_track, 0)) {
|
||||
// Lookup the actual slab meta for this block
|
||||
SuperSlab* ss = ss_fast_lookup(base);
|
||||
if (ss && ss->magic == SUPERSLAB_MAGIC) {
|
||||
int slab_idx = slab_index_for(ss, base);
|
||||
if (slab_idx >= 0 && slab_idx < ss_slabs_capacity(ss)) {
|
||||
TinySlabMeta* meta = &ss->slabs[slab_idx];
|
||||
atomic_fetch_sub_explicit(&meta->active, 1, memory_order_relaxed);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Option B: Periodic TLS SLL Drain (restore slab accounting consistency)
|
||||
// Purpose: Every N frees (default: 1024), drain TLS SLL → slab freelist
|
||||
// Impact: Enables empty detection → SuperSlabs freed → LRU cache functional
|
||||
|
||||
Reference in New Issue
Block a user