// ss_release_policy_box.c - SuperSlab Release Policy Box Implementation #include "ss_release_policy_box.h" #include "ss_mem_lean_env_box.h" #include "madvise_guard_box.h" #include "ss_os_acquire_box.h" #include "../superslab/superslab_types.h" #include #include // ============================================================================ // Release Policy Implementation // ============================================================================ bool ss_should_keep_superslab(SuperSlab* ss, int class_idx) { (void)ss; // Reserved for future budget logic (void)class_idx; // Reserved for per-class policy // In lean mode: allow release of empty superslabs // In FAST mode (default): keep all superslabs (persistent backend) if (ss_mem_lean_enabled()) { // TODO: Add per-class budget logic here if needed // For now: allow release (caller decides based on empty state) return false; // Signal: OK to release in lean mode } // Default (FAST mode): keep all superslabs (speed-first) return true; } int ss_maybe_decommit_superslab(void* ptr, size_t size) { // Fast path: lean mode disabled → no-op if (!ss_mem_lean_enabled()) { return 0; } // Get decommit mode from ENV ss_mem_lean_decommit_mode_t mode = ss_mem_lean_decommit_mode(); // If decommit is OFF, skip (only prewarm suppression active) if (mode == SS_MEM_LEAN_DECOMMIT_OFF) { return 0; } // Select madvise advice based on mode int advice; switch (mode) { case SS_MEM_LEAN_DECOMMIT_FREE: #ifdef MADV_FREE advice = MADV_FREE; // Lazy reclaim (fast, kernel 4.5+) #else // Fallback to MADV_DONTNEED if MADV_FREE not available advice = MADV_DONTNEED; #endif break; case SS_MEM_LEAN_DECOMMIT_DONTNEED: advice = MADV_DONTNEED; // Eager reclaim (slower, but universal) break; default: return 0; // Unknown mode, skip } // Call DSO-guarded madvise (respects guard rules) // This will: // - Skip if ptr overlaps DSO (.fini_array safety) // - Disable future calls on ENOMEM (fail-fast) // - Update madvise counters int ret = ss_os_madvise_guarded(ptr, size, advice, "ss_release_policy_decommit"); if (ret == 0) { // Success: update lean_decommit counter ss_os_stats_record_lean_decommit(); } return ret; }