aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJorge Aparicio <japaricious@gmail.com>2017-04-07 18:57:13 -0500
committerJorge Aparicio <japaricious@gmail.com>2017-04-07 18:57:13 -0500
commit185f368d63e6b083d1717c3625b7756e77782add (patch)
treedf8c25a4d19a5b365f76c42f4b4c6eaa8e433aec /src
parent22bb0d8eaef26dc9f276b89b85f20121a372197f (diff)
use volatile read/writes for checked::Resource.locked
Diffstat (limited to 'src')
-rw-r--r--src/checked.rs15
-rw-r--r--src/lib.rs1
2 files changed, 9 insertions, 7 deletions
diff --git a/src/checked.rs b/src/checked.rs
index eb0da3d..87318ec 100644
--- a/src/checked.rs
+++ b/src/checked.rs
@@ -5,26 +5,27 @@ use core::cell::UnsafeCell;
use cortex_m::interrupt;
use cortex_m::register::{basepri, basepri_max};
+use vcell::VolatileCell;
use Ceiling;
-unsafe fn acquire(locked: &UnsafeCell<bool>, ceiling: u8) -> u8 {
+unsafe fn acquire(locked: &VolatileCell<bool>, ceiling: u8) -> u8 {
interrupt::free(
|_| {
- assert!(!*locked.get(), "resource already locked");
+ assert!(!locked.get(), "resource already locked");
let old_basepri = basepri::read();
basepri_max::write(ceiling);
- *locked.get() = true;
+ locked.set(true);
old_basepri
},
)
}
-unsafe fn release(locked: &UnsafeCell<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
// interrupt::free(
// |_| {
- *locked.get() = false;
+ locked.set(false);
basepri::write(old_basepri);
// },
// );
@@ -34,7 +35,7 @@ unsafe fn release(locked: &UnsafeCell<bool>, old_basepri: u8) {
pub struct Resource<T, C> {
_marker: PhantomData<C>,
data: UnsafeCell<T>,
- locked: UnsafeCell<bool>,
+ locked: VolatileCell<bool>,
}
impl<T, C> Resource<T, C>
@@ -46,7 +47,7 @@ where
Resource {
_marker: PhantomData,
data: UnsafeCell::new(data),
- locked: UnsafeCell::new(false),
+ locked: VolatileCell::new(false),
}
}
diff --git a/src/lib.rs b/src/lib.rs
index 7cd0ff6..a7b6412 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -9,6 +9,7 @@
#![no_std]
extern crate cortex_m;
+extern crate vcell;
pub mod checked;