From 12fab6e2209d61bc5f916bf057d21f2726ea8741 Mon Sep 17 00:00:00 2001 From: Victoria Brekenfeld Date: Tue, 11 Jun 2024 17:24:46 +0200 Subject: [PATCH] kms: Don't block surface-threads on startup cond --- src/backend/kms/device.rs | 4 ++-- src/backend/kms/mod.rs | 4 ++-- src/backend/kms/surface/mod.rs | 17 +++++++---------- src/backend/mod.rs | 11 +++++++---- src/config/mod.rs | 4 ++-- src/state.rs | 8 ++++---- 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/backend/kms/device.rs b/src/backend/kms/device.rs index 41329f94..b07a91b6 100644 --- a/src/backend/kms/device.rs +++ b/src/backend/kms/device.rs @@ -32,7 +32,7 @@ use std::{ collections::{HashMap, HashSet}, fmt, path::{Path, PathBuf}, - sync::{Arc, Condvar, Mutex, RwLock}, + sync::{atomic::AtomicBool, Arc, RwLock}, }; use super::{drm_helpers, socket::Socket, surface::Surface}; @@ -475,7 +475,7 @@ impl Device { position: (i32, i32), evlh: &LoopHandle<'static, State>, shell: Arc>, - startup_done: Arc<(Mutex, Condvar)>, + startup_done: Arc, ) -> Result<(Output, bool)> { let output = self .outputs diff --git a/src/backend/kms/mod.rs b/src/backend/kms/mod.rs index b4f4eb76..4a5084aa 100644 --- a/src/backend/kms/mod.rs +++ b/src/backend/kms/mod.rs @@ -35,7 +35,7 @@ use std::{ borrow::BorrowMut, collections::{HashMap, HashSet}, path::Path, - sync::{Arc, Condvar, Mutex, RwLock}, + sync::{atomic::AtomicBool, Arc, RwLock}, }; mod device; @@ -474,7 +474,7 @@ impl KmsState { test_only: bool, loop_handle: &LoopHandle<'static, State>, shell: Arc>, - startup_done: Arc<(Mutex, Condvar)>, + startup_done: Arc, ) -> Result, anyhow::Error> { if !self.session.is_active() { return Ok(Vec::new()); diff --git a/src/backend/kms/surface/mod.rs b/src/backend/kms/surface/mod.rs index a848efb8..45158dd6 100644 --- a/src/backend/kms/surface/mod.rs +++ b/src/backend/kms/surface/mod.rs @@ -79,7 +79,7 @@ use std::{ sync::{ atomic::{AtomicBool, Ordering}, mpsc::{Receiver, SyncSender}, - Arc, Condvar, Mutex, RwLock, + Arc, RwLock, }, time::Duration, }; @@ -252,7 +252,7 @@ impl Surface { target_node: DrmNode, evlh: &LoopHandle<'static, State>, shell: Arc>, - startup_done: Arc<(Mutex, Condvar)>, + startup_done: Arc, ) -> Result { let (tx, rx) = channel::(); let (tx2, rx2) = channel::(); @@ -441,7 +441,7 @@ fn surface_thread( active: Arc, thread_sender: Sender, thread_receiver: Channel, - startup_done: Arc<(Mutex, Condvar)>, + startup_done: Arc, ) -> Result<()> { profiling::register_thread!(format!("Surface Thread {}", output.name())); @@ -517,13 +517,8 @@ fn surface_thread( state.on_vblank(metadata); } Event::Msg(ThreadCommand::ScheduleRender) => { - { - // Wait for start up. - let (lock, cvar) = &*startup_done; - // As long as the value inside the `Mutex` is `false`, we wait. - let _guard = cvar - .wait_while(lock.lock().unwrap(), |startup_done| !*startup_done) - .unwrap(); + if !startup_done.load(Ordering::SeqCst) { + return; } state.queue_redraw(false); @@ -534,6 +529,8 @@ fn surface_thread( Event::Msg(ThreadCommand::SetMode(mode, result)) => { if let Some(compositor) = state.compositor.as_mut() { let _ = result.send(compositor.use_mode(mode).map_err(Into::into)); + } else { + let _ = result.send(Err(anyhow::anyhow!("Set mode with inactive surface"))); } } Event::Closed | Event::Msg(ThreadCommand::End) => { diff --git a/src/backend/mod.rs b/src/backend/mod.rs index caba2d44..c4f3335f 100644 --- a/src/backend/mod.rs +++ b/src/backend/mod.rs @@ -68,10 +68,13 @@ pub fn init_backend_auto( { { - let (lock, cvar) = &*state.common.startup_done; - let mut startup = lock.lock().unwrap(); - *startup = true; - cvar.notify_all(); + state + .common + .startup_done + .store(true, std::sync::atomic::Ordering::SeqCst); + for output in state.common.shell.read().unwrap().outputs() { + state.backend.schedule_render(&output); + } } } } diff --git a/src/config/mod.rs b/src/config/mod.rs index c4352e77..626a6817 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -28,7 +28,7 @@ use std::{ collections::HashMap, fs::OpenOptions, path::PathBuf, - sync::{Arc, Condvar, Mutex, RwLock}, + sync::{atomic::AtomicBool, Arc, RwLock}, }; use tracing::{debug, error, info, warn}; @@ -322,7 +322,7 @@ impl Config { loop_handle: &LoopHandle<'static, State>, workspace_state: &mut WorkspaceUpdateGuard<'_, State>, xdg_activation_state: &XdgActivationState, - startup_done: Arc<(Mutex, Condvar)>, + startup_done: Arc, ) { let outputs = output_state.outputs().collect::>(); let mut infos = outputs diff --git a/src/state.rs b/src/state.rs index 2747f0b0..179d841a 100644 --- a/src/state.rs +++ b/src/state.rs @@ -101,7 +101,7 @@ use std::{ collections::HashSet, ffi::OsString, process::Child, - sync::{Arc, Condvar, Mutex, Once, RwLock}, + sync::{atomic::AtomicBool, Arc, Mutex, Once, RwLock}, time::Duration, }; @@ -174,7 +174,7 @@ pub struct Common { pub shell: Arc>, pub clock: Clock, - pub startup_done: Arc<(Mutex, Condvar)>, + pub startup_done: Arc, pub should_stop: bool, pub local_offset: time::UtcOffset, pub gesture_state: Option, @@ -274,7 +274,7 @@ impl BackendData { shell: Arc>, workspace_state: &mut WorkspaceUpdateGuard<'_, State>, xdg_activation_state: &XdgActivationState, - startup_done: Arc<(Mutex, Condvar)>, + startup_done: Arc, ) -> Result<(), anyhow::Error> { let result = match self { BackendData::Kms(ref mut state) => { @@ -510,7 +510,7 @@ impl State { local_offset, clock, - startup_done: Arc::new((Mutex::new(false), Condvar::new())), + startup_done: Arc::new(AtomicBool::new(false)), should_stop: false, gesture_state: None,