From e4a6d7aeddd686e47e1a26cd129e7bb646dcb0be Mon Sep 17 00:00:00 2001 From: okhsunrog Date: Wed, 21 May 2025 21:30:23 +0300 Subject: [PATCH] fix: lock on early return --- embassy-stm32/src/flash/eeprom.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/embassy-stm32/src/flash/eeprom.rs b/embassy-stm32/src/flash/eeprom.rs index 68bcc6c15..cc3529eb9 100644 --- a/embassy-stm32/src/flash/eeprom.rs +++ b/embassy-stm32/src/flash/eeprom.rs @@ -1,3 +1,5 @@ +use embassy_hal_internal::drop::OnDrop; + use super::{family, Blocking, Error, Flash, EEPROM_BASE, EEPROM_SIZE}; #[cfg(eeprom)] @@ -68,8 +70,8 @@ impl<'d> Flash<'d, Blocking> { self.check_eeprom_offset(offset, 1)?; unsafe { family::unlock(); + let _on_drop = OnDrop::new(|| family::lock()); self.eeprom_write_u8_slice_unlocked(offset, core::slice::from_ref(&value))?; - family::lock(); } Ok(()) } @@ -84,8 +86,8 @@ impl<'d> Flash<'d, Blocking> { self.check_eeprom_offset(offset, 2)?; unsafe { family::unlock(); + let _on_drop = OnDrop::new(|| family::lock()); self.eeprom_write_u16_slice_unlocked(offset, core::slice::from_ref(&value))?; - family::lock(); } Ok(()) } @@ -100,8 +102,8 @@ impl<'d> Flash<'d, Blocking> { self.check_eeprom_offset(offset, 4)?; unsafe { family::unlock(); + let _on_drop = OnDrop::new(|| family::lock()); self.eeprom_write_u32_slice_unlocked(offset, core::slice::from_ref(&value))?; - family::lock(); } Ok(()) } @@ -111,8 +113,8 @@ impl<'d> Flash<'d, Blocking> { self.check_eeprom_offset(offset, data.len() as u32)?; unsafe { family::unlock(); + let _on_drop = OnDrop::new(|| family::lock()); self.eeprom_write_u8_slice_unlocked(offset, data)?; - family::lock(); } Ok(()) } @@ -127,8 +129,8 @@ impl<'d> Flash<'d, Blocking> { self.check_eeprom_offset(offset, data.len() as u32 * 2)?; unsafe { family::unlock(); + let _on_drop = OnDrop::new(|| family::lock()); self.eeprom_write_u16_slice_unlocked(offset, data)?; - family::lock(); } Ok(()) } @@ -143,8 +145,8 @@ impl<'d> Flash<'d, Blocking> { self.check_eeprom_offset(offset, data.len() as u32 * 4)?; unsafe { family::unlock(); + let _on_drop = OnDrop::new(|| family::lock()); self.eeprom_write_u32_slice_unlocked(offset, data)?; - family::lock(); } Ok(()) } @@ -154,7 +156,6 @@ impl<'d> Flash<'d, Blocking> { /// This method will write unaligned prefix and suffix as bytes, and aligned middle as u32. pub fn eeprom_write_slice(&mut self, offset: u32, data: &[u8]) -> Result<(), Error> { self.check_eeprom_offset(offset, data.len() as u32)?; - let start = offset; let misalign = (start % 4) as usize; let prefix_len = if misalign == 0 { @@ -168,6 +169,8 @@ impl<'d> Flash<'d, Blocking> { unsafe { family::unlock(); + let _on_drop = OnDrop::new(|| family::lock()); + if !prefix.is_empty() { self.eeprom_write_u8_slice_unlocked(start, prefix)?; } @@ -187,7 +190,6 @@ impl<'d> Flash<'d, Blocking> { let suffix_offset = start + (prefix_len + aligned_len) as u32; self.eeprom_write_u8_slice_unlocked(suffix_offset, suffix)?; } - family::lock(); } Ok(()) }