cog_task/server/scheduler/
p_async.rs

1use 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}