| use core::sync::atomic::{Atomic, AtomicU32, Ordering}; | |
| use crate::os::xous::ffi::Connection; | |
| pub(crate) enum TicktimerScalar { | |
| ElapsedMs, | |
| SleepMs(usize), | |
| LockMutex(usize /* cookie */), | |
| UnlockMutex(usize /* cookie */), | |
| WaitForCondition(usize /* cookie */, usize /* timeout (ms) */), | |
| NotifyCondition(usize /* cookie */, usize /* count */), | |
| FreeMutex(usize /* cookie */), | |
| FreeCondition(usize /* cookie */), | |
| } | |
| impl Into<[usize; 5]> for TicktimerScalar { | |
| fn into(self) -> [usize; 5] { | |
| match self { | |
| TicktimerScalar::ElapsedMs => [0, 0, 0, 0, 0], | |
| TicktimerScalar::SleepMs(msecs) => [1, msecs, 0, 0, 0], | |
| TicktimerScalar::LockMutex(cookie) => [6, cookie, 0, 0, 0], | |
| TicktimerScalar::UnlockMutex(cookie) => [7, cookie, 0, 0, 0], | |
| TicktimerScalar::WaitForCondition(cookie, timeout_ms) => [8, cookie, timeout_ms, 0, 0], | |
| TicktimerScalar::NotifyCondition(cookie, count) => [9, cookie, count, 0, 0], | |
| TicktimerScalar::FreeMutex(cookie) => [10, cookie, 0, 0, 0], | |
| TicktimerScalar::FreeCondition(cookie) => [11, cookie, 0, 0, 0], | |
| } | |
| } | |
| } | |
| /// Returns a `Connection` to the ticktimer server. This server is used for synchronization | |
| /// primitives such as sleep, Mutex, and Condvar. | |
| pub(crate) fn ticktimer_server() -> Connection { | |
| static TICKTIMER_SERVER_CONNECTION: Atomic<u32> = AtomicU32::new(0); | |
| let cid = TICKTIMER_SERVER_CONNECTION.load(Ordering::Relaxed); | |
| if cid != 0 { | |
| return cid.into(); | |
| } | |
| let cid = crate::os::xous::ffi::connect("ticktimer-server".try_into().unwrap()).unwrap(); | |
| TICKTIMER_SERVER_CONNECTION.store(cid.into(), Ordering::Relaxed); | |
| cid | |
| } |