From 60ff2241ed08ec4102f635e1bb75c70bbaba822c Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Thu, 21 Nov 2024 14:33:21 -0500 Subject: [PATCH] feat: try to gracefully shut down settings daemon when exiting --- Cargo.lock | 25 ++++++++++++------------- Cargo.toml | 4 ++-- src/main.rs | 23 ++++++++++++++++++++++- 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 87d960f..eb91c2a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -694,10 +694,10 @@ checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" [[package]] name = "launch-pad" version = "0.1.0" -source = "git+https://github.com/pop-os/launch-pad#a267ea1fe5f80b30f82b8ec557a88b23fa4ebdc3" +source = "git+https://github.com/pop-os/launch-pad?branch=feat-graceful-stop#e1f20362928555b33e4e38eb8f41af734c5c03b4" dependencies = [ "log", - "nix 0.26.2", + "nix 0.26.4", "rand", "slotmap", "sync_wrapper", @@ -833,16 +833,15 @@ dependencies = [ [[package]] name = "nix" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", "memoffset 0.7.1", "pin-utils", - "static_assertions", ] [[package]] @@ -1225,9 +1224,9 @@ dependencies = [ [[package]] name = "slotmap" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" dependencies = [ "version_check", ] @@ -1267,9 +1266,9 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" [[package]] name = "tempfile" @@ -1287,18 +1286,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.41" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c16a64ba9387ef3fdae4f9c1a7f07a0997fce91985c0336f1ddc1822b3b37802" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.41" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d14928354b01c4d6a4f0e549069adef399a284e7995c7ccca94e8a07a5346c59" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 250dafd..8be864c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,9 +13,9 @@ color-eyre = "0.6" futures-util = "0.3" cosmic-dbus-a11y = { git = "https://github.com/pop-os/dbus-settings-bindings" } -launch-pad = { git = "https://github.com/pop-os/launch-pad" } +# launch-pad = { git = "https://github.com/pop-os/launch-pad" } itertools = "0.12" -#launch-pad = { git = "https://github.com/pop-os/launch-pad", branch = "remove-sync-bounds" } +launch-pad = { git = "https://github.com/pop-os/launch-pad", branch = "feat-graceful-stop" } libc = "0.2" log-panics = { version = "2", features = ["with-backtrace"] } rustix = "0.38" diff --git a/src/main.rs b/src/main.rs index 8da576e..9765eb0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -162,7 +162,9 @@ async fn start( let stdout_span = info_span!(parent: None, "cosmic-settings-daemon"); let stderr_span = stdout_span.clone(); - process_manager + let (settings_exit_tx, settings_exit_rx) = oneshot::channel(); + let settings_exit_tx = Arc::new(std::sync::Mutex::new(Some(settings_exit_tx))); + let settings_daemon = process_manager .start( Process::new() .with_executable("cosmic-settings-daemon") @@ -179,6 +181,14 @@ async fn start( warn!("{}", line); } .instrument(stderr_span) + }) + .with_on_exit(move |_, _, _, will_restart| { + if !will_restart { + if let Some(tx) = settings_exit_tx.lock().unwrap().take() { + _ = tx.send(()); + } + } + async {} }), ) .await @@ -403,6 +413,17 @@ async fn start( } compositor_handle.abort(); token.cancel(); + if let Err(err) = process_manager.stop_process(settings_daemon).await { + tracing::error!("Failed to gracefully stop settings daemon. {err:?}"); + } else { + match tokio::time::timeout(Duration::from_secs(1), settings_exit_rx).await { + Ok(Ok(_)) => {} + _ => { + tracing::error!("Failed to gracefully stop settings daemon."); + } + }; + }; + tokio::time::sleep(std::time::Duration::from_secs(2)).await; Ok(status) }