diff --git a/Cargo.lock b/Cargo.lock index c95f342..eae45c1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -897,18 +897,18 @@ checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" [[package]] name = "serde" -version = "1.0.133" +version = "1.0.134" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97565067517b60e2d1ea8b268e59ce036de907ac523ad83a0475da04e818989a" +checksum = "96b3c34c1690edf8174f5b289a336ab03f568a4460d8c6df75f2f3a692b3bc6a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.133" +version = "1.0.134" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed201699328568d8d08208fdd080e3ff594e6c422e438b6705905da01005d537" +checksum = "784ed1fbfa13fe191077537b0d70ec8ad1e903cfe04831da608aa36457cb653d" dependencies = [ "proc-macro2", "quote", @@ -1230,6 +1230,7 @@ dependencies = [ "env_logger 0.9.0", "inotify", "itertools", + "lazy_static", "log", "mockall", "serde", diff --git a/Cargo.toml b/Cargo.toml index 885f674..5a496c8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ ddc-hi = "0.4" log = "0.4" env_logger = "0.9" inotify = "0.10" +lazy_static = "1.4" [dev-dependencies] mockall = "0.10" diff --git a/src/brightness/ddcutil.rs b/src/brightness/ddcutil.rs index 948dea1..09a5108 100644 --- a/src/brightness/ddcutil.rs +++ b/src/brightness/ddcutil.rs @@ -1,7 +1,13 @@ use ddc_hi::{Ddc, Display, FeatureCode}; use itertools::Itertools; +use lazy_static::lazy_static; use std::cell::RefCell; use std::error::Error; +use std::sync::Mutex; + +lazy_static! { + static ref DDC_MUTEX: Mutex<()> = Mutex::new(()); +} const DDC_BRIGHTNESS_FEATURE: FeatureCode = 0x10; @@ -26,6 +32,9 @@ impl DdcUtil { impl super::Brightness for DdcUtil { fn get(&mut self) -> Result> { + let _lock = DDC_MUTEX + .lock() + .expect("Unable to acquire exclusive access to DDC API"); Ok(self .display .borrow_mut() @@ -35,6 +44,9 @@ impl super::Brightness for DdcUtil { } fn set(&mut self, value: u64) -> Result> { + let _lock = DDC_MUTEX + .lock() + .expect("Unable to acquire exclusive access to DDC API"); let value = value.max(self.min_brightness).min(self.max_brightness); self.display .borrow_mut()