diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:02:58 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:02:58 +0000 |
commit | 698f8c2f01ea549d77d7dc3338a12e04c11057b9 (patch) | |
tree | 173a775858bd501c378080a10dca74132f05bc50 /library/std/src/sys_common/condvar.rs | |
parent | Initial commit. (diff) | |
download | rustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.tar.xz rustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.zip |
Adding upstream version 1.64.0+dfsg1.upstream/1.64.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'library/std/src/sys_common/condvar.rs')
-rw-r--r-- | library/std/src/sys_common/condvar.rs | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/library/std/src/sys_common/condvar.rs b/library/std/src/sys_common/condvar.rs new file mode 100644 index 000000000..f3ac1061b --- /dev/null +++ b/library/std/src/sys_common/condvar.rs @@ -0,0 +1,56 @@ +use crate::sys::locks as imp; +use crate::sys_common::mutex::MovableMutex; +use crate::time::Duration; + +mod check; + +type CondvarCheck = <imp::MovableMutex as check::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] + 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) + } +} |