diff --git a/src/comp.rs b/src/comp.rs index 7b48fce..e2a03f9 100644 --- a/src/comp.rs +++ b/src/comp.rs @@ -18,6 +18,7 @@ use tokio::{ mpsc::{self, unbounded_channel}, oneshot, }, + task::JoinHandle, }; use tokio_util::sync::CancellationToken; use tracing::Instrument; @@ -190,7 +191,7 @@ pub fn run_compositor( token: CancellationToken, mut socket_rx: mpsc::UnboundedReceiver>, env_tx: oneshot::Sender>, -) -> Result<()> { +) -> Result>> { let (tx, mut rx) = unbounded_channel::(); let (session, comp) = UnixStream::pair().wrap_err("failed to create pair of unix sockets")?; let (mut session_rx, mut session_tx) = session.into_split(); @@ -206,7 +207,7 @@ pub fn run_compositor( }; let span = info_span!(parent: None, "cosmic-comp"); let _span = span.clone(); - tokio::spawn( + Ok(tokio::spawn( async move { ProcessHandler::new(tx, &token).run( "cosmic-comp", @@ -236,6 +237,5 @@ pub fn run_compositor( Result::<()>::Ok(()) } .instrument(_span), - ); - Ok(()) + )) } diff --git a/src/main.rs b/src/main.rs index 2225cce..6e87af9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -35,9 +35,8 @@ async fn main() -> Result<()> { let token = CancellationToken::new(); let (socket_tx, socket_rx) = mpsc::unbounded_channel(); let (env_tx, env_rx) = oneshot::channel(); - if let Err(err) = comp::run_compositor(token.child_token(), socket_rx, env_tx) { - error!("compositor errored: {:?}", err); - } + let compositor_handle = comp::run_compositor(token.child_token(), socket_rx, env_tx) + .wrap_err("failed to start compositor")?; systemd::start_systemd_target() .await .wrap_err("failed to start systemd target")?; @@ -69,17 +68,23 @@ async fn main() -> Result<()> { socket_tx.send(sockets).unwrap(); let mut signals = Signals::new(vec![libc::SIGTERM, libc::SIGINT]).unwrap(); - while let Some(signal) = signals.next().await { - match signal { - libc::SIGTERM | libc::SIGINT => { - info!("received request to terminate"); - token.cancel(); - tokio::time::sleep(std::time::Duration::from_secs(2)).await; + loop { + tokio::select! { + _ = compositor_handle => { + info!("compositor exited"); break; + }, + signal = signals.next() => match signal { + Some(libc::SIGTERM | libc::SIGINT) => { + info!("received request to terminate"); + break; + } + Some(signal) => unreachable!("received unhandled signal {}", signal), + None => break, } - _ => unreachable!("received unhandled signal {}", signal), } } - + token.cancel(); + tokio::time::sleep(std::time::Duration::from_secs(2)).await; Ok(()) }