diff --git a/Cargo.lock b/Cargo.lock index 0245213bbde78b525d3141d234da01b53320dc48..bb565208e835a69439eb44bd843e7cb37025444e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -230,9 +230,9 @@ checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anyhow" -version = "1.0.93" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" [[package]] name = "apply" @@ -892,9 +892,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.21" +version = "4.5.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" +checksum = "69371e34337c4c984bbe322360c2547210bf632eb2814bbe78a6e87a2935bd2b" dependencies = [ "clap_builder", "clap_derive", @@ -902,9 +902,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.21" +version = "4.5.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" +checksum = "6e24c1b4099818523236a8ca881d2b45db98dadfb4625cf6608c12069fcbbde1" dependencies = [ "anstyle", "clap_lex", @@ -1156,7 +1156,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#b524ccb0a46b1ca585db09638c33e39e79829716" +source = "git+https://github.com/pop-os/libcosmic.git#ff0ba4860c9ba732e601485f1952fde5fe5f6952" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1178,7 +1178,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#b524ccb0a46b1ca585db09638c33e39e79829716" +source = "git+https://github.com/pop-os/libcosmic.git#ff0ba4860c9ba732e601485f1952fde5fe5f6952" dependencies = [ "quote", "syn 1.0.109", @@ -1201,7 +1201,7 @@ dependencies = [ [[package]] name = "cosmic-settings-daemon" version = "0.1.0" -source = "git+https://github.com/pop-os/dbus-settings-bindings#62100129240d164e39fff16bda34faad520936de" +source = "git+https://github.com/pop-os/dbus-settings-bindings#0eee63a96c8b1f6555ca797b5c12545c372b1a1b" dependencies = [ "zbus 4.4.0", ] @@ -1232,7 +1232,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#b524ccb0a46b1ca585db09638c33e39e79829716" +source = "git+https://github.com/pop-os/libcosmic.git#ff0ba4860c9ba732e601485f1952fde5fe5f6952" dependencies = [ "almost", "cosmic-config", @@ -2327,9 +2327,9 @@ checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -2525,7 +2525,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#b524ccb0a46b1ca585db09638c33e39e79829716" +source = "git+https://github.com/pop-os/libcosmic.git#ff0ba4860c9ba732e601485f1952fde5fe5f6952" dependencies = [ "dnd", "iced_accessibility", @@ -2543,7 +2543,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#b524ccb0a46b1ca585db09638c33e39e79829716" +source = "git+https://github.com/pop-os/libcosmic.git#ff0ba4860c9ba732e601485f1952fde5fe5f6952" dependencies = [ "accesskit", "accesskit_winit", @@ -2552,7 +2552,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#b524ccb0a46b1ca585db09638c33e39e79829716" +source = "git+https://github.com/pop-os/libcosmic.git#ff0ba4860c9ba732e601485f1952fde5fe5f6952" dependencies = [ "bitflags 2.6.0", "bytes", @@ -2575,7 +2575,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#b524ccb0a46b1ca585db09638c33e39e79829716" +source = "git+https://github.com/pop-os/libcosmic.git#ff0ba4860c9ba732e601485f1952fde5fe5f6952" dependencies = [ "futures", "iced_core", @@ -2601,7 +2601,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#b524ccb0a46b1ca585db09638c33e39e79829716" +source = "git+https://github.com/pop-os/libcosmic.git#ff0ba4860c9ba732e601485f1952fde5fe5f6952" dependencies = [ "bitflags 2.6.0", "bytemuck", @@ -2623,7 +2623,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#b524ccb0a46b1ca585db09638c33e39e79829716" +source = "git+https://github.com/pop-os/libcosmic.git#ff0ba4860c9ba732e601485f1952fde5fe5f6952" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -2635,7 +2635,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#b524ccb0a46b1ca585db09638c33e39e79829716" +source = "git+https://github.com/pop-os/libcosmic.git#ff0ba4860c9ba732e601485f1952fde5fe5f6952" dependencies = [ "bytes", "dnd", @@ -2649,7 +2649,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#b524ccb0a46b1ca585db09638c33e39e79829716" +source = "git+https://github.com/pop-os/libcosmic.git#ff0ba4860c9ba732e601485f1952fde5fe5f6952" dependencies = [ "bytemuck", "cosmic-text", @@ -2665,7 +2665,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#b524ccb0a46b1ca585db09638c33e39e79829716" +source = "git+https://github.com/pop-os/libcosmic.git#ff0ba4860c9ba732e601485f1952fde5fe5f6952" dependencies = [ "as-raw-xcb-connection", "bitflags 2.6.0", @@ -2696,7 +2696,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#b524ccb0a46b1ca585db09638c33e39e79829716" +source = "git+https://github.com/pop-os/libcosmic.git#ff0ba4860c9ba732e601485f1952fde5fe5f6952" dependencies = [ "dnd", "iced_renderer", @@ -2713,7 +2713,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#b524ccb0a46b1ca585db09638c33e39e79829716" +source = "git+https://github.com/pop-os/libcosmic.git#ff0ba4860c9ba732e601485f1952fde5fe5f6952" dependencies = [ "dnd", "iced_futures", @@ -2979,9 +2979,9 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "2.0.3" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a611371471e98973dbcab4e0ec66c31a10bc356eeb4d54a0e05eac8158fe38c" +checksum = "06432fb54d3be7964ecd3649233cddf80db2832f47fec34c01f65b3d9d774983" [[package]] name = "ipnet" @@ -3312,7 +3312,7 @@ checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" [[package]] name = "libcosmic" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#b524ccb0a46b1ca585db09638c33e39e79829716" +source = "git+https://github.com/pop-os/libcosmic.git#ff0ba4860c9ba732e601485f1952fde5fe5f6952" dependencies = [ "apply", "ashpd 0.9.2", @@ -5651,9 +5651,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -6212,7 +6212,7 @@ checksum = "c89532cc712a2adb119eb4d09694b402576052254d0bb284f82ac1c47fb786ad" dependencies = [ "bitflags 2.6.0", "downcast-rs", - "io-lifetimes 2.0.3", + "io-lifetimes 2.0.4", "rustix 0.38.41", "wayland-backend", "wayland-scanner", diff --git a/amadeus/src/app/bottom_bar.rs b/amadeus/src/app/bottom_bar.rs index 6f12b2e1dc034ecb85c6cc3d9ef40c7dd5460ec2..4fd332305ab3cfa346a73966ea2c455736982c5b 100644 --- a/amadeus/src/app/bottom_bar.rs +++ b/amadeus/src/app/bottom_bar.rs @@ -121,7 +121,7 @@ fn view_kara_id<'a>(kid: KId) -> Element<'a, Message> { /// kara is playing. pub fn view<'a>(app: &AppModel) -> Element<'a, Message> { match app.lektord_state.current_kid() { - None => return widget::row().into(), + None => widget::row().into(), Some(kid) => match app.store.get(kid) { KaraOrId::Kara(kara) => vec![view_left_part(kara), view_right_part(kara)], KaraOrId::Id(kid) => vec![view_kara_id(kid)], diff --git a/amadeus/src/config.rs b/amadeus/src/config.rs index 24e21a14dcf0aeb7b4bbcf6dade2a797c672113b..4c79d76e45f4345cc0f2d06a7d66e0aba3e9ac60 100644 --- a/amadeus/src/config.rs +++ b/amadeus/src/config.rs @@ -128,7 +128,7 @@ impl From<&log::Level> for LogLevel { impl<'de> Deserialize<'de> for LogLevel { fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> { struct StrVisitor; - impl<'de> Visitor<'de> for StrVisitor { + impl Visitor<'_> for StrVisitor { type Value = log::Level; fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { diff --git a/amadeus/src/store.rs b/amadeus/src/store.rs index ff6f229717f568f3399873a6050181b68e483cd0..92656b99288942ebdda61ce3795bd4c0cc4cb746 100644 --- a/amadeus/src/store.rs +++ b/amadeus/src/store.rs @@ -18,7 +18,7 @@ pub enum KaraOrId<'a> { Id(KId), } -impl<'a> KaraOrId<'a> { +impl KaraOrId<'_> { pub fn id(&self) -> KId { match self { KaraOrId::Kara(kara) => kara.id, diff --git a/amadeus/src/store/history.rs b/amadeus/src/store/history.rs index eae05c48d85f23b13b9ffaa18de11a1c329d19ed..447a13097d9fc7cdc5c4a04031d00d81f6ce81ca 100644 --- a/amadeus/src/store/history.rs +++ b/amadeus/src/store/history.rs @@ -19,7 +19,7 @@ impl<'a> HistoryIter<'a> { } } -impl<'a> Iterator for HistoryIter<'a> { +impl Iterator for HistoryIter<'_> { type Item = KId; fn next(&mut self) -> Option<Self::Item> { diff --git a/amadeus/src/store/playlist_content.rs b/amadeus/src/store/playlist_content.rs index 1b6c7a20e03aa4e5f47e6dd572e01c95a556268d..ec5512e0011f583eb676208f797f9111ce9db5b2 100644 --- a/amadeus/src/store/playlist_content.rs +++ b/amadeus/src/store/playlist_content.rs @@ -18,7 +18,7 @@ impl<'a> PlaylistContentIter<'a> { } } -impl<'a> Iterator for PlaylistContentIter<'a> { +impl Iterator for PlaylistContentIter<'_> { type Item = KId; fn next(&mut self) -> Option<Self::Item> { diff --git a/amadeus/src/store/queue_level.rs b/amadeus/src/store/queue_level.rs index c90f995284b3ca53c632fbf4980196510a76c8a0..a83f47384102103ad40a486b030c9bb37efde589 100644 --- a/amadeus/src/store/queue_level.rs +++ b/amadeus/src/store/queue_level.rs @@ -19,7 +19,7 @@ impl<'a> QueueLevelIter<'a> { } } -impl<'a> Iterator for QueueLevelIter<'a> { +impl Iterator for QueueLevelIter<'_> { type Item = KId; fn next(&mut self) -> Option<Self::Item> { diff --git a/lektor_utils/src/config/serde_utils.rs b/lektor_utils/src/config/serde_utils.rs index 09a6fb9acfe2c6d4c60eb11a65b4899f2c396661..52a8299346751fc28f2a93d1ebfe6a12a2c5ab9f 100644 --- a/lektor_utils/src/config/serde_utils.rs +++ b/lektor_utils/src/config/serde_utils.rs @@ -30,7 +30,7 @@ pub fn deserialize_log_level<'de, D: Deserializer<'de>>( }; } - impl<'de> Visitor<'de> for LogLevelVisitor { + impl Visitor<'_> for LogLevelVisitor { type Value = LogLevel; fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { diff --git a/lektord/src/c_wrapper/commands.rs b/lektord/src/c_wrapper/commands.rs index c12fe75a376d7976f2862d0f76b06269a51dde1f..d2294e7b9e38c460ff8eb124eac5af3505360c90 100644 --- a/lektord/src/c_wrapper/commands.rs +++ b/lektord/src/c_wrapper/commands.rs @@ -104,13 +104,18 @@ pub(crate) fn player_set_playback_volume(vol: i64) -> Result<()> { } fn send_msg(msg: PlayerEvent) { - match unsafe { STATE.get() } { - Some((sender, _)) => { - let _ = sender - .blocking_send(msg) - .map_err(|err| log::error!("failed to send msg {msg:?}: {err}")); - } - None => log::error!("no lektord state was set for the player module"), + match (STATE.read().ok()) + .and_then(|lock| { + lock.get().map(|(sender, _)| { + sender + .blocking_send(msg) + .with_context(|| format!("failed to send message: {msg:?}")) + }) + }) + .context("no lektord state was set for the player module, or failed to lock its mutex") + { + Ok(Err(err)) | Err(err) => log::error!("{err}"), + Ok(Ok(())) => {} } } diff --git a/lektord/src/c_wrapper/mod.rs b/lektord/src/c_wrapper/mod.rs index 97b4d3c79288753929436443d580475a9c14df34..d744f2a6764c3ec091a41e1ad3afff0f5e450008 100644 --- a/lektord/src/c_wrapper/mod.rs +++ b/lektord/src/c_wrapper/mod.rs @@ -1,12 +1,12 @@ //! Interface with the C/C++ part of the code. The only place we allow unsafe code in this crate. use crate::LektorStatePtr; -use anyhow::{bail, ensure, Context, Result}; +use anyhow::{ensure, Context as _, Result}; use lektor_utils::config::LektorPlayerConfig; use std::{ ffi::*, ptr::NonNull, - sync::{Arc, OnceLock}, + sync::{Arc, OnceLock, RwLock}, }; mod abort; @@ -21,10 +21,12 @@ pub(crate) use commands::*; /// constructor... /// /// TODO: Pass it to the player module and see how to decrement the strong count latter... -static mut STATE: OnceLock<( - tokio::sync::mpsc::Sender<PlayerEvent>, - tokio::task::JoinHandle<()>, -)> = OnceLock::new(); +static STATE: RwLock< + OnceLock<( + tokio::sync::mpsc::Sender<PlayerEvent>, + tokio::task::JoinHandle<()>, + )>, +> = RwLock::new(OnceLock::new()); #[derive(Debug, Clone, Copy)] enum PlayerEvent { @@ -112,13 +114,15 @@ pub(crate) fn init_player_module(ptr: LektorStatePtr, config: LektorPlayerConfig } }); - unsafe { - // Set the state for the C/C++ code - ensure!( - STATE.set((sender, handle)).is_ok(), - "failed to register the lektord state pointer for the player module" - ); + // Set the state for the C/C++ code + ensure!( + (STATE.write().ok().context("failed to lock state mutex")?) + .set((sender, handle)) + .is_ok(), + "failed to register the lektord state pointer for the player module" + ); + unsafe { // Pass options to the C/C++ code ensure!( 0 == mod_set_msg_options( @@ -155,13 +159,12 @@ pub async fn close_player_module() -> Result<()> { fn mod_close() -> c_int; } - match unsafe { STATE.take() } { - None => bail!("the player state wasn't initialized"), - Some((sender, handle)) => { - drop(sender); - let _ = handle.await.map_err(|e| log::error!("{e}")); - } - } + let (sender, handle) = (STATE.write().ok().context("failed to lock state mutex")?) + .take() + .context("the player state wasn't initialized")?; + + drop(sender); + let _ = handle.await.map_err(|e| log::error!("{e}")); (0 == unsafe { mod_close() }) .then_some(())