fix: lock on early return

This commit is contained in:
okhsunrog 2025-05-21 21:30:23 +03:00
parent 966186064e
commit e4a6d7aedd

View File

@ -1,3 +1,5 @@
use embassy_hal_internal::drop::OnDrop;
use super::{family, Blocking, Error, Flash, EEPROM_BASE, EEPROM_SIZE}; use super::{family, Blocking, Error, Flash, EEPROM_BASE, EEPROM_SIZE};
#[cfg(eeprom)] #[cfg(eeprom)]
@ -68,8 +70,8 @@ impl<'d> Flash<'d, Blocking> {
self.check_eeprom_offset(offset, 1)?; self.check_eeprom_offset(offset, 1)?;
unsafe { unsafe {
family::unlock(); family::unlock();
let _on_drop = OnDrop::new(|| family::lock());
self.eeprom_write_u8_slice_unlocked(offset, core::slice::from_ref(&value))?; self.eeprom_write_u8_slice_unlocked(offset, core::slice::from_ref(&value))?;
family::lock();
} }
Ok(()) Ok(())
} }
@ -84,8 +86,8 @@ impl<'d> Flash<'d, Blocking> {
self.check_eeprom_offset(offset, 2)?; self.check_eeprom_offset(offset, 2)?;
unsafe { unsafe {
family::unlock(); family::unlock();
let _on_drop = OnDrop::new(|| family::lock());
self.eeprom_write_u16_slice_unlocked(offset, core::slice::from_ref(&value))?; self.eeprom_write_u16_slice_unlocked(offset, core::slice::from_ref(&value))?;
family::lock();
} }
Ok(()) Ok(())
} }
@ -100,8 +102,8 @@ impl<'d> Flash<'d, Blocking> {
self.check_eeprom_offset(offset, 4)?; self.check_eeprom_offset(offset, 4)?;
unsafe { unsafe {
family::unlock(); family::unlock();
let _on_drop = OnDrop::new(|| family::lock());
self.eeprom_write_u32_slice_unlocked(offset, core::slice::from_ref(&value))?; self.eeprom_write_u32_slice_unlocked(offset, core::slice::from_ref(&value))?;
family::lock();
} }
Ok(()) Ok(())
} }
@ -111,8 +113,8 @@ impl<'d> Flash<'d, Blocking> {
self.check_eeprom_offset(offset, data.len() as u32)?; self.check_eeprom_offset(offset, data.len() as u32)?;
unsafe { unsafe {
family::unlock(); family::unlock();
let _on_drop = OnDrop::new(|| family::lock());
self.eeprom_write_u8_slice_unlocked(offset, data)?; self.eeprom_write_u8_slice_unlocked(offset, data)?;
family::lock();
} }
Ok(()) Ok(())
} }
@ -127,8 +129,8 @@ impl<'d> Flash<'d, Blocking> {
self.check_eeprom_offset(offset, data.len() as u32 * 2)?; self.check_eeprom_offset(offset, data.len() as u32 * 2)?;
unsafe { unsafe {
family::unlock(); family::unlock();
let _on_drop = OnDrop::new(|| family::lock());
self.eeprom_write_u16_slice_unlocked(offset, data)?; self.eeprom_write_u16_slice_unlocked(offset, data)?;
family::lock();
} }
Ok(()) Ok(())
} }
@ -143,8 +145,8 @@ impl<'d> Flash<'d, Blocking> {
self.check_eeprom_offset(offset, data.len() as u32 * 4)?; self.check_eeprom_offset(offset, data.len() as u32 * 4)?;
unsafe { unsafe {
family::unlock(); family::unlock();
let _on_drop = OnDrop::new(|| family::lock());
self.eeprom_write_u32_slice_unlocked(offset, data)?; self.eeprom_write_u32_slice_unlocked(offset, data)?;
family::lock();
} }
Ok(()) 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. /// 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> { pub fn eeprom_write_slice(&mut self, offset: u32, data: &[u8]) -> Result<(), Error> {
self.check_eeprom_offset(offset, data.len() as u32)?; self.check_eeprom_offset(offset, data.len() as u32)?;
let start = offset; let start = offset;
let misalign = (start % 4) as usize; let misalign = (start % 4) as usize;
let prefix_len = if misalign == 0 { let prefix_len = if misalign == 0 {
@ -168,6 +169,8 @@ impl<'d> Flash<'d, Blocking> {
unsafe { unsafe {
family::unlock(); family::unlock();
let _on_drop = OnDrop::new(|| family::lock());
if !prefix.is_empty() { if !prefix.is_empty() {
self.eeprom_write_u8_slice_unlocked(start, prefix)?; 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; let suffix_offset = start + (prefix_len + aligned_len) as u32;
self.eeprom_write_u8_slice_unlocked(suffix_offset, suffix)?; self.eeprom_write_u8_slice_unlocked(suffix_offset, suffix)?;
} }
family::lock();
} }
Ok(()) Ok(())
} }