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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user