1use core::{cell::UnsafeCell, time::Duration};
2
3use sys::os::{TimeSpanType, event::*};
4
5pub struct Event {
7 inner: UnsafeCell<EventType>,
8}
9
10impl Event {
11 pub fn new(signaled: bool, clear_mode: EventClearMode) -> Self {
13 let mut inner = EventType::default();
14 unsafe { nnosInitializeEvent(&mut inner, signaled, clear_mode) };
15 Self {
16 inner: UnsafeCell::new(inner),
17 }
18 }
19
20 pub fn finalize(&self) {
22 unsafe { nnosFinalizeEvent(self.ptr()) };
23 }
24
25 pub fn signal(&self) {
27 unsafe { nnosSignalEvent(self.ptr()) };
28 }
29
30 pub fn wait(&self) {
32 unsafe { nnosWaitEvent(self.ptr()) };
33 }
34
35 pub fn try_wait(&self) -> bool {
37 unsafe { nnosTryWaitEvent(self.ptr()) }
38 }
39
40 pub fn wait_timeout(&self, timeout: Duration) -> bool {
42 let timeout = timeout.as_nanos() as u64;
43 unsafe { nnosTimedWaitEvent(self.ptr(), TimeSpanType(timeout)) }
44 }
45
46 pub fn clear(&self) {
48 unsafe { nnosClearEvent(self.ptr()) };
49 }
50
51 pub(crate) fn ptr(&self) -> *mut EventType {
52 self.inner.get()
53 }
54}
55
56impl Drop for Event {
57 fn drop(&mut self) {
58 self.finalize();
59 }
60}