Type Definition r3::sync::mutex::StaticMutex

source ·
pub type StaticMutex<System, T> = GenericMutex<Hunk<System, UnsafeCell<MaybeUninit<T>>>, StaticMutex<System>>;
Available on crate feature sync only.
Expand description

A defined (statically created) GenericMutex.

Example

use r3::{kernel::StaticTask, sync::StaticMutex};

struct Objects {
    task2: StaticTask<System>,
    mutex: StaticMutex<System, i32>,
}

const fn configure_app<C>(cfg: &mut Cfg<C>) -> Objects
where
    C: ~const traits::CfgTask<System = System> +
       ~const traits::CfgMutex,
{
    StaticTask::define()
        .start(task1_body)
        .priority(2)
        .active(true)
        .finish(cfg);

    let task2 = StaticTask::define()
        .start(task2_body)
        .priority(1)
        .finish(cfg);

    let mutex = StaticMutex::define().init(|| 1).finish(cfg);

    Objects { task2, mutex }
}

fn task1_body() {
    let mut guard = COTTAGE.mutex.lock().unwrap();

    // Although `task2` has a higher priority, it's unable to
    // access `*guard` until `task1` releases the lock
    COTTAGE.task2.activate().unwrap();

    assert_eq!(*guard, 1);
    *guard = 2;
}

fn task2_body() {
    let mut guard = COTTAGE.mutex.lock().unwrap();
    assert_eq!(*guard, 2);
    *guard = 3;
}

Implementations§

source§

impl<System, T: 'static> StaticMutex<System, T>where System: KernelMutex + KernelStatic,

source

pub const fn define() -> Definer<System, DefaultSource<T>>

Construct a Definer to define a mutex in a configuration function.