1 use crate::cell::UnsafeCell; 2 use crate::sys::c; 3 use crate::sys::mutex::{self, Mutex}; 4 use crate::sys::os; 5 use crate::time::Duration; 6 7 pub struct Condvar { 8 inner: UnsafeCell<c::CONDITION_VARIABLE>, 9 } 10 11 pub type MovableCondvar = Condvar; 12 13 unsafe impl Send for Condvar {} 14 unsafe impl Sync for Condvar {} 15 16 impl Condvar { new() -> Condvar17 pub const fn new() -> Condvar { 18 Condvar { inner: UnsafeCell::new(c::CONDITION_VARIABLE_INIT) } 19 } 20 21 #[inline] init(&mut self)22 pub unsafe fn init(&mut self) {} 23 24 #[inline] wait(&self, mutex: &Mutex)25 pub unsafe fn wait(&self, mutex: &Mutex) { 26 let r = c::SleepConditionVariableSRW(self.inner.get(), mutex::raw(mutex), c::INFINITE, 0); 27 debug_assert!(r != 0); 28 } 29 wait_timeout(&self, mutex: &Mutex, dur: Duration) -> bool30 pub unsafe fn wait_timeout(&self, mutex: &Mutex, dur: Duration) -> bool { 31 let r = c::SleepConditionVariableSRW( 32 self.inner.get(), 33 mutex::raw(mutex), 34 super::dur2timeout(dur), 35 0, 36 ); 37 if r == 0 { 38 debug_assert_eq!(os::errno() as usize, c::ERROR_TIMEOUT as usize); 39 false 40 } else { 41 true 42 } 43 } 44 45 #[inline] notify_one(&self)46 pub unsafe fn notify_one(&self) { 47 c::WakeConditionVariable(self.inner.get()) 48 } 49 50 #[inline] notify_all(&self)51 pub unsafe fn notify_all(&self) { 52 c::WakeAllConditionVariable(self.inner.get()) 53 } 54 destroy(&self)55 pub unsafe fn destroy(&self) { 56 // ... 57 } 58 } 59