cog_task/server/scheduler/
p_async.rs1use crate::comm::{QReader, QWriter};
2use crate::resource::{Logger, LoggerSignal};
3use crate::server::{Config, Info, ServerSignal};
4use chrono::{DateTime, Local};
5use eyre::Result;
6use std::thread;
7
8#[derive(Debug, Clone)]
9pub enum AsyncSignal {
10 Logger(DateTime<Local>, LoggerSignal),
11 Finish,
12}
13
14pub struct AsyncProcessor {
15 logger: Logger,
16 async_reader: QReader<AsyncSignal>,
17 async_writer: QWriter<AsyncSignal>,
18 server_writer: QWriter<ServerSignal>,
19}
20
21impl AsyncProcessor {
22 pub fn spawn(
23 info: &Info,
24 config: &Config,
25 server_writer: &QWriter<ServerSignal>,
26 ) -> Result<QWriter<AsyncSignal>> {
27 let async_reader = QReader::new();
28 let async_writer = async_reader.writer();
29 let mut proc = Self {
30 logger: Logger::new(info, config)?,
31 async_reader,
32 async_writer,
33 server_writer: server_writer.clone(),
34 };
35
36 let async_writer = proc.async_writer.clone();
37
38 thread::spawn(move || {
39 while let Some(signal) = proc.async_reader.pop() {
40 match signal {
41 AsyncSignal::Logger(time, signal) => {
42 proc.logger
43 .update(time, signal, &proc.async_writer)
44 .unwrap();
45 }
46 AsyncSignal::Finish => break,
47 }
48 }
49
50 proc.server_writer
51 .push(ServerSignal::AsyncComplete(proc.logger.finish()));
52 });
53
54 Ok(async_writer)
55 }
56}