xref: /drstd/src/std/sys/windows/locks/condvar.rs (revision 9670759b785600bf6315e4173e46a602f16add7a)
1 use crate::std::cell::UnsafeCell;
2 use crate::std::sys::c;
3 use crate::std::sys::locks::{mutex, Mutex};
4 use crate::std::sys::os;
5 use crate::std::time::Duration;
6 
7 pub struct Condvar {
8     inner: UnsafeCell<c::CONDITION_VARIABLE>,
9 }
10 
11 unsafe impl Send for Condvar {}
12 unsafe impl Sync for Condvar {}
13 
14 impl Condvar {
15     #[inline]
new() -> Condvar16     pub const fn new() -> Condvar {
17         Condvar {
18             inner: UnsafeCell::new(c::CONDITION_VARIABLE_INIT),
19         }
20     }
21 
22     #[inline]
wait(&self, mutex: &Mutex)23     pub unsafe fn wait(&self, mutex: &Mutex) {
24         let r = c::SleepConditionVariableSRW(self.inner.get(), mutex::raw(mutex), c::INFINITE, 0);
25         debug_assert!(r != 0);
26     }
27 
wait_timeout(&self, mutex: &Mutex, dur: Duration) -> bool28     pub unsafe fn wait_timeout(&self, mutex: &Mutex, dur: Duration) -> bool {
29         let r = c::SleepConditionVariableSRW(
30             self.inner.get(),
31             mutex::raw(mutex),
32             crate::std::sys::windows::dur2timeout(dur),
33             0,
34         );
35         if r == 0 {
36             debug_assert_eq!(os::errno() as usize, c::ERROR_TIMEOUT as usize);
37             false
38         } else {
39             true
40         }
41     }
42 
43     #[inline]
notify_one(&self)44     pub fn notify_one(&self) {
45         unsafe { c::WakeConditionVariable(self.inner.get()) }
46     }
47 
48     #[inline]
notify_all(&self)49     pub fn notify_all(&self) {
50         unsafe { c::WakeAllConditionVariable(self.inner.get()) }
51     }
52 }
53