win_events/events/
pulse.rs

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