perf(gpio): only acquire pins lock once
This commit is contained in:
22
src/gpio.rs
22
src/gpio.rs
@@ -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 })
|
||||
|
||||
Reference in New Issue
Block a user