aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorokhsunrog <[email protected]>2025-05-21 21:30:23 +0300
committerokhsunrog <[email protected]>2025-05-21 21:30:23 +0300
commite4a6d7aeddd686e47e1a26cd129e7bb646dcb0be (patch)
tree707028eb0e68b5dee81ed6947e19f079655d1a5b
parent966186064ebf36634e9930dd4b2d83ed675f6eb0 (diff)
fix: lock on early return
-rw-r--r--embassy-stm32/src/flash/eeprom.rs18
1 files 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 @@
1use embassy_hal_internal::drop::OnDrop;
2
1use super::{family, Blocking, Error, Flash, EEPROM_BASE, EEPROM_SIZE}; 3use super::{family, Blocking, Error, Flash, EEPROM_BASE, EEPROM_SIZE};
2 4
3#[cfg(eeprom)] 5#[cfg(eeprom)]
@@ -68,8 +70,8 @@ impl<'d> Flash<'d, Blocking> {
68 self.check_eeprom_offset(offset, 1)?; 70 self.check_eeprom_offset(offset, 1)?;
69 unsafe { 71 unsafe {
70 family::unlock(); 72 family::unlock();
73 let _on_drop = OnDrop::new(|| family::lock());
71 self.eeprom_write_u8_slice_unlocked(offset, core::slice::from_ref(&value))?; 74 self.eeprom_write_u8_slice_unlocked(offset, core::slice::from_ref(&value))?;
72 family::lock();
73 } 75 }
74 Ok(()) 76 Ok(())
75 } 77 }
@@ -84,8 +86,8 @@ impl<'d> Flash<'d, Blocking> {
84 self.check_eeprom_offset(offset, 2)?; 86 self.check_eeprom_offset(offset, 2)?;
85 unsafe { 87 unsafe {
86 family::unlock(); 88 family::unlock();
89 let _on_drop = OnDrop::new(|| family::lock());
87 self.eeprom_write_u16_slice_unlocked(offset, core::slice::from_ref(&value))?; 90 self.eeprom_write_u16_slice_unlocked(offset, core::slice::from_ref(&value))?;
88 family::lock();
89 } 91 }
90 Ok(()) 92 Ok(())
91 } 93 }
@@ -100,8 +102,8 @@ impl<'d> Flash<'d, Blocking> {
100 self.check_eeprom_offset(offset, 4)?; 102 self.check_eeprom_offset(offset, 4)?;
101 unsafe { 103 unsafe {
102 family::unlock(); 104 family::unlock();
105 let _on_drop = OnDrop::new(|| family::lock());
103 self.eeprom_write_u32_slice_unlocked(offset, core::slice::from_ref(&value))?; 106 self.eeprom_write_u32_slice_unlocked(offset, core::slice::from_ref(&value))?;
104 family::lock();
105 } 107 }
106 Ok(()) 108 Ok(())
107 } 109 }
@@ -111,8 +113,8 @@ impl<'d> Flash<'d, Blocking> {
111 self.check_eeprom_offset(offset, data.len() as u32)?; 113 self.check_eeprom_offset(offset, data.len() as u32)?;
112 unsafe { 114 unsafe {
113 family::unlock(); 115 family::unlock();
116 let _on_drop = OnDrop::new(|| family::lock());
114 self.eeprom_write_u8_slice_unlocked(offset, data)?; 117 self.eeprom_write_u8_slice_unlocked(offset, data)?;
115 family::lock();
116 } 118 }
117 Ok(()) 119 Ok(())
118 } 120 }
@@ -127,8 +129,8 @@ impl<'d> Flash<'d, Blocking> {
127 self.check_eeprom_offset(offset, data.len() as u32 * 2)?; 129 self.check_eeprom_offset(offset, data.len() as u32 * 2)?;
128 unsafe { 130 unsafe {
129 family::unlock(); 131 family::unlock();
132 let _on_drop = OnDrop::new(|| family::lock());
130 self.eeprom_write_u16_slice_unlocked(offset, data)?; 133 self.eeprom_write_u16_slice_unlocked(offset, data)?;
131 family::lock();
132 } 134 }
133 Ok(()) 135 Ok(())
134 } 136 }
@@ -143,8 +145,8 @@ impl<'d> Flash<'d, Blocking> {
143 self.check_eeprom_offset(offset, data.len() as u32 * 4)?; 145 self.check_eeprom_offset(offset, data.len() as u32 * 4)?;
144 unsafe { 146 unsafe {
145 family::unlock(); 147 family::unlock();
148 let _on_drop = OnDrop::new(|| family::lock());
146 self.eeprom_write_u32_slice_unlocked(offset, data)?; 149 self.eeprom_write_u32_slice_unlocked(offset, data)?;
147 family::lock();
148 } 150 }
149 Ok(()) 151 Ok(())
150 } 152 }
@@ -154,7 +156,6 @@ impl<'d> Flash<'d, Blocking> {
154 /// This method will write unaligned prefix and suffix as bytes, and aligned middle as u32. 156 /// This method will write unaligned prefix and suffix as bytes, and aligned middle as u32.
155 pub fn eeprom_write_slice(&mut self, offset: u32, data: &[u8]) -> Result<(), Error> { 157 pub fn eeprom_write_slice(&mut self, offset: u32, data: &[u8]) -> Result<(), Error> {
156 self.check_eeprom_offset(offset, data.len() as u32)?; 158 self.check_eeprom_offset(offset, data.len() as u32)?;
157
158 let start = offset; 159 let start = offset;
159 let misalign = (start % 4) as usize; 160 let misalign = (start % 4) as usize;
160 let prefix_len = if misalign == 0 { 161 let prefix_len = if misalign == 0 {
@@ -168,6 +169,8 @@ impl<'d> Flash<'d, Blocking> {
168 169
169 unsafe { 170 unsafe {
170 family::unlock(); 171 family::unlock();
172 let _on_drop = OnDrop::new(|| family::lock());
173
171 if !prefix.is_empty() { 174 if !prefix.is_empty() {
172 self.eeprom_write_u8_slice_unlocked(start, prefix)?; 175 self.eeprom_write_u8_slice_unlocked(start, prefix)?;
173 } 176 }
@@ -187,7 +190,6 @@ impl<'d> Flash<'d, Blocking> {
187 let suffix_offset = start + (prefix_len + aligned_len) as u32; 190 let suffix_offset = start + (prefix_len + aligned_len) as u32;
188 self.eeprom_write_u8_slice_unlocked(suffix_offset, suffix)?; 191 self.eeprom_write_u8_slice_unlocked(suffix_offset, suffix)?;
189 } 192 }
190 family::lock();
191 } 193 }
192 Ok(()) 194 Ok(())
193 } 195 }