From 60816709c45f1a8655f6106838a2bb2deee6ab0d Mon Sep 17 00:00:00 2001 From: enricobuehler Date: Sat, 4 Jul 2026 23:45:36 +0000 Subject: [PATCH] fix(vdisplay): call life.acquire() outside debug_assert (release no-op) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The pooled entry's lifecycle transition was inside debug_assert_eq!, whose arguments don't evaluate in release builds — so acquire() never ran, the entry stayed Idle, and release saw Noop → immediate teardown (no keep-alive). Caught on-glass on the CachyOS box. Co-Authored-By: Claude Opus 4.8 (1M context) --- crates/punktfunk-host/src/vdisplay/registry.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/crates/punktfunk-host/src/vdisplay/registry.rs b/crates/punktfunk-host/src/vdisplay/registry.rs index 42acf58..977b89d 100644 --- a/crates/punktfunk-host/src/vdisplay/registry.rs +++ b/crates/punktfunk-host/src/vdisplay/registry.rs @@ -136,7 +136,7 @@ mod linux { use anyhow::Result; use super::DisplayInfo; - use crate::vdisplay::lifecycle::{self, Acquire, Release}; + use crate::vdisplay::lifecycle::{self, Release}; use crate::vdisplay::policy::{self, Linger}; use crate::vdisplay::{Mode, VirtualDisplay, VirtualOutput}; @@ -257,7 +257,8 @@ mod linux { ) && e.backend == backend && e.mode == mode }) { - debug_assert_eq!(e.life.acquire(), Acquire::Reuse); + // Lingering/Pinned → Active (Acquire::Reuse); side effect matters, value is known. + e.life.acquire(); let gen = r.gen.fetch_add(1, Ordering::Relaxed); e.gen = gen; let out = output_for(e.node_id, e.preferred_mode, gen); @@ -288,7 +289,7 @@ mod linux { let preferred_mode = real.preferred_mode; let gen = r.gen.fetch_add(1, Ordering::Relaxed); let mut life = lifecycle::State::default(); - debug_assert_eq!(life.acquire(), Acquire::Create); + life.acquire(); // Idle → Active{refs:1} (Acquire::Create) let entry = Entry { life, keepalive: real.keepalive,