You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: prio-inversion.rs
    path of file: ./repos/rtic/rtic/examples
    
    the code of the file until where you have to start completion: //! examples/prio-inversion.rs
//!
//! Here we test to make sure we don't have priority inversion.

#![no_main]
#![no_std]
#![deny(warnings)]
#![deny(unsafe_code)]
#![deny(missing_docs)]

use panic_semihosting as _;
use rtic::app;

// t1 p1 use b, a
// t2 p2 use a
// t3 p3
// t4 p4 use b
//
// so t1 start , take b take a, pend t3
// t3 should not start
// try to see if it starts, IT SHOULD NOT

#[app(device = lm3s6965, dispatchers = [SSI0, QEI0, GPIOA, GPIOB])]
mod app {
    use cortex_m_semihosting::{debug, hprintln};

    #[shared]
    struct Shared {
        a: u32,
        b: u32,
    }

    #[l
    
    async fn foo(cx: foo::Context) {
        let foo::SharedResources { mut a, mut b, .. } = cx.shared;

        hprintln!("foo - start");

        // basepri = 0
        b.lock(|b| {
            // basepri = max(basepri = 0, ceil(b) = 4) = 4
            a.lock(|a| {
                // basepri = max(basepri = 4, ceil(a) = 2) = 4

                hprintln!("pre baz spawn {} {}", a, b);

                // This spawn should be blocked as prio(baz) = 3
                baz::spawn().unwrap();

                hprintln!("post baz spawn {} {}", a, b);
            });
            // basepri = 4
        });
        // basepri = 0

        hprintln!("foo - end");
        debug::exit(debug::EXIT_SUCCESS); // Exit QEMU simulator
    }