mirror of
https://github.com/rtic-rs/rtic.git
synced 2024-12-25 19:39:32 +01:00
don't let the ceiling token escape the critical section
This commit is contained in:
parent
70f573a6c4
commit
aee1d785a9
2 changed files with 19 additions and 4 deletions
|
@ -110,7 +110,7 @@ impl<T, CEILING> Resource<T, C<CEILING>> {
|
|||
/// [Resource.borrow](struct.Resource.html#method.borrow).
|
||||
#[cfg(not(thumbv6m))]
|
||||
pub fn lock<R, PRIORITY, F>(&'static self, _priority: &P<PRIORITY>, f: F) -> R
|
||||
where F: FnOnce(Ref<T>, C<CEILING>) -> R,
|
||||
where F: FnOnce(Ref<T>, &C<CEILING>) -> R,
|
||||
CEILING: Cmp<PRIORITY, Output = Greater> + Cmp<UMAX, Output = Less> + Level
|
||||
{
|
||||
unsafe {
|
||||
|
@ -118,7 +118,7 @@ impl<T, CEILING> Resource<T, C<CEILING>> {
|
|||
basepri_max::write(<CEILING>::hw());
|
||||
barrier!();
|
||||
let ret =
|
||||
f(Ref::new(&*self.data.get()), C { _marker: PhantomData });
|
||||
f(Ref::new(&*self.data.get()), &C { _marker: PhantomData });
|
||||
barrier!();
|
||||
basepri::write(old_basepri);
|
||||
ret
|
||||
|
@ -209,7 +209,7 @@ impl<Periph, CEILING> Peripheral<Periph, C<CEILING>> {
|
|||
/// See [Resource.lock](./struct.Resource.html#method.lock)
|
||||
#[cfg(not(thumbv6m))]
|
||||
pub fn lock<R, PRIORITY, F>(&'static self, _priority: &P<PRIORITY>, f: F) -> R
|
||||
where F: FnOnce(Ref<Periph>, C<CEILING>) -> R,
|
||||
where F: FnOnce(Ref<Periph>, &C<CEILING>) -> R,
|
||||
CEILING: Cmp<PRIORITY, Output = Greater> + Cmp<UMAX, Output = Less> + Level
|
||||
{
|
||||
unsafe {
|
||||
|
@ -218,7 +218,7 @@ impl<Periph, CEILING> Peripheral<Periph, C<CEILING>> {
|
|||
barrier!();
|
||||
let ret = f(
|
||||
Ref::new(&*self.peripheral.get()),
|
||||
C { _marker: PhantomData },
|
||||
&C { _marker: PhantomData },
|
||||
);
|
||||
barrier!();
|
||||
basepri::write(old_basepri);
|
||||
|
|
15
tests/cfail/ceiling.rs
Normal file
15
tests/cfail/ceiling.rs
Normal file
|
@ -0,0 +1,15 @@
|
|||
extern crate cortex_m_srp;
|
||||
|
||||
use cortex_m_srp::{C3, P2, Resource};
|
||||
|
||||
static R1: Resource<(), C3> = Resource::new(());
|
||||
|
||||
fn j1(prio: P2) {
|
||||
let c3 = R1.lock(&prio, |r1, c3| {
|
||||
// forbidden: ceiling token can't outlive critical section
|
||||
c3 //~ error
|
||||
});
|
||||
|
||||
// Would be bad: lockless access to a resource with ceiling = 3
|
||||
let r2 = R1.borrow(&prio, c3);
|
||||
}
|
Loading…
Reference in a new issue