2025-11-20 02:01:52 +09:00
|
|
|
#ifndef SS_SLAB_META_BOX_H
|
|
|
|
|
#define SS_SLAB_META_BOX_H
|
|
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
// Box: SlabMeta Access Layer (Phase 3d-A)
|
|
|
|
|
// ============================================================================
|
|
|
|
|
// Purpose: Encapsulate SuperSlab metadata field access
|
|
|
|
|
// Boundary: SuperSlab internal layout (slabs[] array)
|
|
|
|
|
// Benefits:
|
|
|
|
|
// - Single point of change for future layout optimizations
|
|
|
|
|
// - Enables Hot/Cold split without touching call sites
|
|
|
|
|
// - Supports A/B testing via compile-time flags
|
|
|
|
|
//
|
|
|
|
|
// Design: Thin inline wrappers (zero overhead, unchanged behavior)
|
|
|
|
|
// ============================================================================
|
|
|
|
|
|
|
|
|
|
#include "../superslab/superslab_types.h"
|
2025-11-22 02:46:57 +09:00
|
|
|
#include "slab_freelist_atomic.h" // Phase 1: Atomic freelist accessor
|
2025-11-20 02:01:52 +09:00
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
// HOT field accessors (frequent access on alloc/free paths)
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
2025-11-22 02:46:57 +09:00
|
|
|
// Get freelist pointer (HOT field) - ATOMIC for MT safety
|
2025-11-20 02:01:52 +09:00
|
|
|
static inline void* ss_slab_meta_freelist_get(SuperSlab* ss, int slab_idx) {
|
2025-11-22 02:46:57 +09:00
|
|
|
return slab_freelist_load_relaxed(&ss->slabs[slab_idx]);
|
2025-11-20 02:01:52 +09:00
|
|
|
}
|
|
|
|
|
|
2025-11-22 02:46:57 +09:00
|
|
|
// Set freelist pointer (HOT field) - ATOMIC for MT safety
|
2025-11-20 02:01:52 +09:00
|
|
|
static inline void ss_slab_meta_freelist_set(SuperSlab* ss, int slab_idx, void* ptr) {
|
2025-11-22 02:46:57 +09:00
|
|
|
slab_freelist_store_relaxed(&ss->slabs[slab_idx], ptr);
|
2025-11-20 02:01:52 +09:00
|
|
|
}
|
|
|
|
|
|
2025-11-22 02:46:57 +09:00
|
|
|
// Get used count (HOT field) - ATOMIC for MT safety
|
2025-11-20 02:01:52 +09:00
|
|
|
static inline uint16_t ss_slab_meta_used_get(SuperSlab* ss, int slab_idx) {
|
2025-11-22 02:46:57 +09:00
|
|
|
return atomic_load_explicit(&ss->slabs[slab_idx].used, memory_order_relaxed);
|
2025-11-20 02:01:52 +09:00
|
|
|
}
|
|
|
|
|
|
2025-11-22 02:46:57 +09:00
|
|
|
// Set used count (HOT field) - ATOMIC for MT safety
|
2025-11-20 02:01:52 +09:00
|
|
|
static inline void ss_slab_meta_used_set(SuperSlab* ss, int slab_idx, uint16_t val) {
|
2025-11-22 02:46:57 +09:00
|
|
|
atomic_store_explicit(&ss->slabs[slab_idx].used, val, memory_order_relaxed);
|
2025-11-20 02:01:52 +09:00
|
|
|
}
|
|
|
|
|
|
2025-11-22 02:46:57 +09:00
|
|
|
// Increment used count (HOT field, common operation) - ATOMIC for MT safety
|
2025-11-20 02:01:52 +09:00
|
|
|
static inline void ss_slab_meta_used_inc(SuperSlab* ss, int slab_idx) {
|
2025-11-22 02:46:57 +09:00
|
|
|
atomic_fetch_add_explicit(&ss->slabs[slab_idx].used, 1, memory_order_relaxed);
|
2025-11-20 02:01:52 +09:00
|
|
|
}
|
|
|
|
|
|
2025-11-22 02:46:57 +09:00
|
|
|
// Decrement used count (HOT field, common operation) - ATOMIC for MT safety
|
2025-11-20 02:01:52 +09:00
|
|
|
static inline void ss_slab_meta_used_dec(SuperSlab* ss, int slab_idx) {
|
2025-11-22 02:46:57 +09:00
|
|
|
atomic_fetch_sub_explicit(&ss->slabs[slab_idx].used, 1, memory_order_relaxed);
|
2025-11-20 02:01:52 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Get capacity (HOT field)
|
|
|
|
|
static inline uint16_t ss_slab_meta_capacity_get(SuperSlab* ss, int slab_idx) {
|
|
|
|
|
return ss->slabs[slab_idx].capacity;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Set capacity (HOT field, set once at init)
|
|
|
|
|
static inline void ss_slab_meta_capacity_set(SuperSlab* ss, int slab_idx, uint16_t val) {
|
|
|
|
|
ss->slabs[slab_idx].capacity = val;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
// COLD field accessors (rare access: init, debug, stats)
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
// Get class_idx (COLD field)
|
|
|
|
|
static inline uint8_t ss_slab_meta_class_idx_get(SuperSlab* ss, int slab_idx) {
|
|
|
|
|
return ss->slabs[slab_idx].class_idx;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Set class_idx (COLD field, set once at init)
|
|
|
|
|
static inline void ss_slab_meta_class_idx_set(SuperSlab* ss, int slab_idx, uint8_t val) {
|
|
|
|
|
ss->slabs[slab_idx].class_idx = val;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Get carved (COLD field)
|
|
|
|
|
static inline uint8_t ss_slab_meta_carved_get(SuperSlab* ss, int slab_idx) {
|
|
|
|
|
return ss->slabs[slab_idx].carved;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Set carved (COLD field)
|
|
|
|
|
static inline void ss_slab_meta_carved_set(SuperSlab* ss, int slab_idx, uint8_t val) {
|
|
|
|
|
ss->slabs[slab_idx].carved = val;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Get owner_tid_low (COLD field, debug only)
|
|
|
|
|
static inline uint8_t ss_slab_meta_owner_tid_low_get(SuperSlab* ss, int slab_idx) {
|
|
|
|
|
return ss->slabs[slab_idx].owner_tid_low;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Set owner_tid_low (COLD field, debug only)
|
|
|
|
|
static inline void ss_slab_meta_owner_tid_low_set(SuperSlab* ss, int slab_idx, uint8_t val) {
|
|
|
|
|
ss->slabs[slab_idx].owner_tid_low = val;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
// Legacy direct pointer access (for gradual migration)
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
// Get pointer to TinySlabMeta (for code that needs direct struct access)
|
|
|
|
|
// TODO Phase 3d-B: Migrate all users to field-specific accessors above
|
|
|
|
|
static inline TinySlabMeta* ss_slab_meta_ptr(SuperSlab* ss, int slab_idx) {
|
|
|
|
|
return &ss->slabs[slab_idx];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif // SS_SLAB_META_BOX_H
|