drop global critical sections in checked::Resource

This commit is contained in:
Jorge Aparicio 2017-04-07 19:33:08 -05:00
parent 185f368d63
commit 6ac2625a75

View file

@ -10,25 +10,16 @@ use vcell::VolatileCell;
use Ceiling; use Ceiling;
unsafe fn acquire(locked: &VolatileCell<bool>, ceiling: u8) -> u8 { unsafe fn acquire(locked: &VolatileCell<bool>, ceiling: u8) -> u8 {
interrupt::free( assert!(!locked.get(), "resource already locked");
|_| { let old_basepri = basepri::read();
assert!(!locked.get(), "resource already locked"); basepri_max::write(ceiling);
let old_basepri = basepri::read(); locked.set(true);
basepri_max::write(ceiling); old_basepri
locked.set(true);
old_basepri
},
)
} }
unsafe fn release(locked: &VolatileCell<bool>, old_basepri: u8) { unsafe fn release(locked: &VolatileCell<bool>, old_basepri: u8) {
// XXX Is it really memory safe to *not* use a global critical section here locked.set(false);
// interrupt::free( basepri::write(old_basepri);
// |_| {
locked.set(false);
basepri::write(old_basepri);
// },
// );
} }
/// A totally safe `Resource` that panics on misuse /// A totally safe `Resource` that panics on misuse
@ -70,7 +61,7 @@ where
/// Mutably locks the resource, blocking tasks with priority equal or /// Mutably locks the resource, blocking tasks with priority equal or
/// smaller than the ceiling `C` /// smaller than the ceiling `C`
pub fn lock_mut<R, F>(&'static self, f: F) -> R pub fn lock_mut<R, F>(&'static self, f: F) -> R
where where
F: FnOnce(&mut T) -> R, F: FnOnce(&mut T) -> R,
{ {
unsafe { unsafe {