sfm_sdk/processors/
task_processor.rs

1use tokio::sync::mpsc::{channel, Receiver, Sender};
2use tokio::task::JoinHandle;
3use tracing::{info};
4use crate::SysSigReceiver;
5
6pub struct TaskProcessor {
7    sender: Sender<JoinHandle<()>>,
8    receiver: Receiver<JoinHandle<()>>,
9    shutdown_receiver: SysSigReceiver
10}
11
12impl TaskProcessor {
13    pub fn generate_new_sender(&mut self) -> Sender<JoinHandle<()>> {
14        self.sender.clone()
15    }
16
17    pub fn new(
18        buffer: usize,
19        sys_sig_receiver: SysSigReceiver
20    ) -> Self {
21        let (sdx, rcx) = channel::<JoinHandle<()>>(
22            buffer
23        );
24
25        Self {
26            sender: sdx,
27            receiver: rcx,
28            shutdown_receiver: sys_sig_receiver
29        }
30    }
31
32    pub async fn start(&mut self) {
33        while !self.shutdown_receiver.is_shutdown() {
34            let received_task = self.receiver.recv().await;
35
36            match received_task {
37                Some(thread) => {
38                    let _ = thread.await;
39                }
40                _ => {}
41            }
42        }
43
44        info!("Shutdown signal was detected, shutting down.");
45    }
46}