cog_task/action/core/
wait.rs

1use crate::action::{Action, StatefulAction};
2use crate::comm::{QWriter, Signal};
3use crate::resource::{IoManager, ResourceManager};
4use crate::server::{AsyncSignal, Config, State, SyncSignal};
5use crate::util::spin_sleeper;
6use eyre::Result;
7use serde::{Deserialize, Serialize};
8use std::sync::{Arc, Mutex};
9use std::thread;
10use std::time::Duration;
11
12#[derive(Debug, Deserialize, Serialize)]
13#[serde(deny_unknown_fields)]
14pub struct Wait(f32);
15
16stateful_arc!(Wait { duration: Duration });
17
18impl Wait {
19    pub fn new(dur: f32) -> Self {
20        Self(dur)
21    }
22}
23
24impl Action for Wait {
25    fn stateful(
26        &self,
27        _io: &IoManager,
28        _res: &ResourceManager,
29        _config: &Config,
30        _sync_writer: &QWriter<SyncSignal>,
31        _async_writer: &QWriter<AsyncSignal>,
32    ) -> Result<Box<dyn StatefulAction>> {
33        Ok(Box::new(StatefulWait {
34            done: Arc::new(Mutex::new(Ok(false))),
35            duration: Duration::from_secs_f32(self.0),
36        }))
37    }
38}
39
40impl StatefulAction for StatefulWait {
41    impl_stateful!();
42
43    #[inline]
44    fn start(
45        &mut self,
46        sync_writer: &mut QWriter<SyncSignal>,
47        _async_writer: &mut QWriter<AsyncSignal>,
48        _state: &State,
49    ) -> Result<Signal> {
50        let done = self.done.clone();
51        let duration = self.duration;
52        let mut sync_writer = sync_writer.clone();
53        thread::spawn(move || {
54            spin_sleeper().sleep(duration);
55            *done.lock().unwrap() = Ok(true);
56            sync_writer.push(SyncSignal::UpdateGraph);
57        });
58        Ok(Signal::none())
59    }
60}