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] 16 pub const fn new() -> Condvar { 17 Condvar { 18 inner: UnsafeCell::new(c::CONDITION_VARIABLE_INIT), 19 } 20 } 21 22 #[inline] 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 28 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] 44 pub fn notify_one(&self) { 45 unsafe { c::WakeConditionVariable(self.inner.get()) } 46 } 47 48 #[inline] 49 pub fn notify_all(&self) { 50 unsafe { c::WakeAllConditionVariable(self.inner.get()) } 51 } 52 } 53