destruction problem solved

This commit is contained in:
Per Lindgren 2021-10-18 18:38:07 +02:00
parent 447507fb46
commit 4a8b0cd787
2 changed files with 56 additions and 3 deletions

View file

@ -1,4 +1,4 @@
//! examples/lockall.rs //! examples/lockall_destruct.rs
#![deny(unsafe_code)] #![deny(unsafe_code)]
#![deny(warnings)] #![deny(warnings)]
@ -30,9 +30,9 @@ mod app {
// when omitted priority is assumed to be `1` // when omitted priority is assumed to be `1`
#[task(shared = [a, b])] #[task(shared = [a, b])]
fn foo(mut c: foo::Context) { fn foo(mut c: foo::Context) {
c.shared.lock(|Shared { a, b }| { c.shared.lock(|foo::Shared { a, b }| {
hprintln!("foo: a = {}, b = {}", a, b).ok(); hprintln!("foo: a = {}, b = {}", a, b).ok();
*a += 1; **a += 1;
bar::spawn().unwrap(); bar::spawn().unwrap();
baz::spawn().unwrap(); baz::spawn().unwrap();
hprintln!("still in foo::lock").ok(); hprintln!("still in foo::lock").ok();

View file

@ -0,0 +1,53 @@
//! examples/lockall_soundness2.rs
// #![deny(unsafe_code)]
#![deny(warnings)]
#![no_main]
#![no_std]
use panic_semihosting as _;
#[rtic::app(device = lm3s6965, dispatchers = [GPIOA])]
mod app {
use cortex_m_semihosting::{debug, hprintln};
#[shared]
struct Shared {
a: u32,
b: i64,
}
#[local]
struct Local {}
#[init]
fn init(_: init::Context) -> (Shared, Local, init::Monotonics) {
foo::spawn().unwrap();
(Shared { a: 1, b: 2 }, Local {}, init::Monotonics())
}
// when omitted priority is assumed to be `1`
#[task(shared = [a, b])]
fn foo(mut c: foo::Context) {
static mut X: Option<&'static mut u32> = None;
static mut Y: u32 = 0;
c.shared.lock(|foo::Shared { a, b }| {
hprintln!("s.a = {}, s.b = {}", a, b).ok();
**a += 1;
// soundness check
// c.shared.lock(|s| {}); // borrow error
// c.shared.a.lock(|s| {}); // borrow error
unsafe {
X = Some(&mut Y);
// X = Some(*a); // lifetime issue
// X = Some(&mut **a); // lifetime issue
// X = Some(&'static mut **a); // not rust
}
hprintln!("s.a = {}, s.b = {}", a, b).ok();
});
debug::exit(debug::EXIT_SUCCESS); // Exit QEMU simulator
}
}