1use core::{cell::UnsafeCell, time::Duration};
2
3use sys::os::{TimeSpanType, condvar::*};
4
5use crate::os::mutex::Mutex;
6
7pub struct ConditionVariable {
13 inner: UnsafeCell<ConditionVariableType>,
14}
15
16impl ConditionVariable {
17 pub fn new() -> Self {
19 let mut inner = ConditionVariableType::default();
20 unsafe { nnosInitializeConditionVariable(&mut inner as *mut ConditionVariableType) };
21 Self {
22 inner: UnsafeCell::new(inner),
23 }
24 }
25
26 pub fn finalize(&self) {
28 unsafe { nnosFinalizeConditionVariable(self.ptr()) };
29 }
30
31 pub fn signal(&self) {
33 unsafe { nnosSignalConditionVariable(self.ptr()) };
34 }
35
36 pub fn broadcast(&self) {
38 unsafe { nnosBroadcastConditionVariable(self.ptr()) };
39 }
40
41 pub fn wait(&self, mutex: &Mutex) {
43 unsafe { nnosWaitConditionVariable(self.ptr(), mutex.ptr()) };
44 }
45
46 pub fn wait_timeout(&self, mutex: &Mutex, timeout: Duration) -> ConditionVariableStatus {
48 let timeout = timeout.as_nanos() as u64;
49 unsafe { nnosTimedWaitConditionVariable(self.ptr(), mutex.ptr(), TimeSpanType(timeout)) }
50 }
51
52 pub(crate) fn ptr(&self) -> *mut ConditionVariableType {
53 self.inner.get()
54 }
55}
56
57impl Drop for ConditionVariable {
58 fn drop(&mut self) {
59 self.finalize();
60 }
61}