win_events/events/
manual_reset.rs

1use std::error::Error;
2use std::sync::atomic::{AtomicBool, Ordering};
3use std::sync::{Arc, MutexGuard};
4use std::time::Duration;
5
6use crate::events::event::{EventHandle, EventState};
7use crate::waiters::waiter::{Signaler, WaitList};
8use crate::{wait_one, Event};
9
10struct ManualResetEventInfo {
11    fired: AtomicBool,
12    waiters: WaitList,
13}
14
15impl ManualResetEventInfo {
16    fn new(init: bool) -> ManualResetEventInfo {
17        ManualResetEventInfo {
18            fired: AtomicBool::new(init),
19            waiters: WaitList::new(),
20        }
21    }
22}
23
24impl EventState for ManualResetEventInfo {
25    fn is_set(&self) -> bool {
26        self.fired.load(Ordering::Relaxed)
27    }
28
29    fn set(&self) {
30        self.fired.store(true, Ordering::Relaxed);
31        self.waiters.fire()
32    }
33
34    fn clear(&self) {
35        self.fired.store(false, Ordering::Relaxed);
36        self.waiters.clear();
37    }
38
39    fn register_signaler(
40        &self,
41        pos: usize,
42        signaler: Arc<dyn Signaler>,
43    ) -> Result<(), Box<dyn Error>> {
44        if self.is_set() {
45            signaler.fire(pos)?;
46        }
47        self.waiters.register_signaler(pos, signaler)
48    }
49
50    fn remove_signaler(&self, signaler: &Arc<dyn Signaler>) -> Result<(), Box<dyn Error>> {
51        self.waiters.remove_signaler(signaler)
52    }
53
54    fn wake_lock(&self) -> Result<Option<MutexGuard<()>>, Box<dyn Error>> {
55        Ok(None)
56    }
57
58    fn can_consume(&self) -> bool {
59        self.fired.load(Ordering::Relaxed)
60    }
61
62    fn consume(&self) {}
63}
64
65/// A ManualResetEvent
66///
67/// An event represents a boolean condition that can be waited on until signaled. This allows a
68/// thread to block and wait for another thread to set the event. Until the event is manually reset
69/// waiting will return immediately.
70///
71/// # Examples
72///
73/// ```
74/// use std::thread;
75/// use std::time::Duration;
76/// use win_events::{Event, ManualResetEvent};
77///
78/// let evt_started = ManualResetEvent::new(false);
79/// let evt_started2 = evt_started.clone();
80///
81/// // spawn a thread and set the cloned event
82/// thread::spawn(move|| {
83///     evt_started2.set();
84/// });
85///
86/// // Wait for the started event
87/// evt_started.wait(Duration::from_millis(100)).unwrap();
88/// ```
89#[derive(Clone)]
90pub struct ManualResetEvent {
91    info: Arc<EventHandle>,
92}
93
94impl ManualResetEvent {
95    /// Creates a new ManualResetEvent and initialized the value.
96    ///
97    /// # Examples
98    ///
99    /// ```
100    /// use win_events::ManualResetEvent;
101    ///
102    /// let evt = ManualResetEvent::new(false);
103    /// ```
104    pub fn new(init: bool) -> ManualResetEvent {
105        let state: Box<dyn EventState> = Box::new(ManualResetEventInfo::new(init));
106        ManualResetEvent {
107            info: Arc::new(EventHandle::new(state)),
108        }
109    }
110
111    /// Gets the current state of the event.
112    ///
113    /// # Examples
114    ///
115    /// ```
116    /// use win_events::ManualResetEvent;
117    ///
118    /// let evt = ManualResetEvent::new(true);
119    /// assert!(evt.is_set())
120    ///  ```
121    pub fn is_set(&self) -> bool {
122        self.info.is_set()
123    }
124
125    /// Sets the event and fires a signal to any threads waiting on the event.
126    ///
127    /// # Examples
128    ///
129    /// ```
130    /// use win_events::ManualResetEvent;
131    ///
132    /// let evt = ManualResetEvent::new(false);
133    /// evt.set();
134    /// assert!(evt.is_set())
135    /// ```
136    pub fn set(&self) {
137        self.info.set()
138    }
139
140    /// Sets the even, causing any waiting threads to receive a signal.
141    ///
142    /// # Examples
143    ///
144    /// ```
145    /// use win_events::ManualResetEvent;
146    ///
147    /// let evt = ManualResetEvent::new(false);
148    /// evt.clear();
149    /// assert!(!evt.is_set())
150    /// ```
151    pub fn clear(&self) {
152        self.info.clear()
153    }
154    /// Creates a new ManualResetEvent and initialized the value.
155    ///
156    /// # Examples
157    ///
158    /// ```
159    /// use std::thread::{sleep, spawn};
160    /// use std::time::Duration;
161    /// use win_events::ManualResetEvent;
162    ///
163    /// let evt = ManualResetEvent::new(false);
164    /// let evt_inner = evt.clone();
165    ///
166    /// let worker = spawn(move || {
167    ///    sleep(Duration::from_millis(3));
168    ///    evt_inner.set()
169    /// });
170    ///
171    /// let wait_result = evt.wait(Duration::from_millis(100)).unwrap();
172    /// assert!(wait_result)
173    /// ```
174    pub fn wait(&self, dur: Duration) -> Result<bool, Box<dyn Error>> {
175        wait_one(self, dur)
176    }
177}
178
179impl Event for ManualResetEvent {
180    fn handle(&self) -> &Arc<EventHandle> {
181        &self.info
182    }
183}