]> git.lizzy.rs Git - rust.git/blob - library/std/src/sys/sgx/condvar.rs
Make it possible to have unboxed condvars on specific platforms.
[rust.git] / library / std / src / sys / sgx / condvar.rs
1 use crate::sys::mutex::Mutex;
2 use crate::time::Duration;
3
4 use super::waitqueue::{SpinMutex, WaitQueue, WaitVariable};
5
6 pub struct Condvar {
7     inner: SpinMutex<WaitVariable<()>>,
8 }
9
10 pub type MovableCondvar = Box<Condvar>;
11
12 impl Condvar {
13     pub const fn new() -> Condvar {
14         Condvar { inner: SpinMutex::new(WaitVariable::new(())) }
15     }
16
17     #[inline]
18     pub unsafe fn init(&mut self) {}
19
20     #[inline]
21     pub unsafe fn notify_one(&self) {
22         let _ = WaitQueue::notify_one(self.inner.lock());
23     }
24
25     #[inline]
26     pub unsafe fn notify_all(&self) {
27         let _ = WaitQueue::notify_all(self.inner.lock());
28     }
29
30     pub unsafe fn wait(&self, mutex: &Mutex) {
31         let guard = self.inner.lock();
32         WaitQueue::wait(guard, || mutex.unlock());
33         mutex.lock()
34     }
35
36     pub unsafe fn wait_timeout(&self, mutex: &Mutex, dur: Duration) -> bool {
37         let success = WaitQueue::wait_timeout(&self.inner, dur, || mutex.unlock());
38         mutex.lock();
39         success
40     }
41
42     #[inline]
43     pub unsafe fn destroy(&self) {}
44 }