cog_task/action/core/
wait.rs1use 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}