use crate::sys::locks as imp; use crate::sys_common::mutex::MovableMutex; use crate::time::Duration; mod check; type CondvarCheck = ::Check; /// An OS-based condition variable. pub struct Condvar { inner: imp::MovableCondvar, check: CondvarCheck, } impl Condvar { /// Creates a new condition variable for use. #[inline] #[rustc_const_stable(feature = "const_locks", since = "1.63.0")] pub const fn new() -> Self { Self { inner: imp::MovableCondvar::new(), check: CondvarCheck::new() } } /// Signals one waiter on this condition variable to wake up. #[inline] pub fn notify_one(&self) { unsafe { self.inner.notify_one() }; } /// Awakens all current waiters on this condition variable. #[inline] pub fn notify_all(&self) { unsafe { self.inner.notify_all() }; } /// Waits for a signal on the specified mutex. /// /// Behavior is undefined if the mutex is not locked by the current thread. /// /// May panic if used with more than one mutex. #[inline] pub unsafe fn wait(&self, mutex: &MovableMutex) { self.check.verify(mutex); self.inner.wait(mutex.raw()) } /// Waits for a signal on the specified mutex with a timeout duration /// specified by `dur` (a relative time into the future). /// /// Behavior is undefined if the mutex is not locked by the current thread. /// /// May panic if used with more than one mutex. #[inline] pub unsafe fn wait_timeout(&self, mutex: &MovableMutex, dur: Duration) -> bool { self.check.verify(mutex); self.inner.wait_timeout(mutex.raw(), dur) } }