fix(vdisplay): call life.acquire() outside debug_assert (release no-op)

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) <noreply@anthropic.com>
This commit is contained in:
2026-07-04 23:45:36 +00:00
parent 783c52dfad
commit 60816709c4
@@ -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,