perf(gpio): only acquire pins lock once

This commit is contained in:
2025-12-22 15:09:13 +01:00
parent a59295e803
commit 19c0ee6283

View File

@@ -5,9 +5,9 @@ use thiserror::Error;
use crate::{
ensure_library_setup,
ffi::{
self, HIGH, INPUT, LOW, OUTPUT, PUD_DOWN, PUD_OFF, PUD_UP, PWM_CLK_DIV_120,
PWM_CLK_DIV_12K, PWM_CLK_DIV_180, PWM_CLK_DIV_240, PWM_CLK_DIV_24K, PWM_CLK_DIV_360,
PWM_CLK_DIV_36K, PWM_CLK_DIV_480, PWM_CLK_DIV_48K, PWM_CLK_DIV_72K, PWM_OUTPUT,
self, HIGH, INPUT, LOW, OUTPUT, PUD_DOWN, PUD_OFF, PUD_UP, PWM_CLK_DIV_12K,
PWM_CLK_DIV_24K, PWM_CLK_DIV_360, PWM_CLK_DIV_36K, PWM_CLK_DIV_480, PWM_CLK_DIV_48K,
PWM_CLK_DIV_72K, PWM_OUTPUT,
},
};
@@ -124,14 +124,18 @@ impl Pin {
pub fn new(pin_id: i32) -> Result<Self, GpioError> {
ensure_library_setup!();
let can_retrieve = !PINS_HANDED_OUT
.lock()
.expect("failed to obtain pin list lock")
.contains(&pin_id);
let can_retrieve = {
let mut vec = PINS_HANDED_OUT.lock().expect("should obtain pins lock");
if vec.contains(&pin_id) {
false
} else {
vec.push(pin_id);
true
}
};
if can_retrieve {
PINS_HANDED_OUT.lock().unwrap().push(pin_id);
let pin_mode = unsafe { ffi::getAlt(pin_id).try_into()? };
Ok(Self { pin_id, pin_mode })