use std::ops::Add; use std::sync::mpsc::{Receiver, TryRecvError}; use std::thread; use std::time::{Duration, SystemTime}; use log::{error, info}; use crate::apiworker::APIWorkerMessage; use crate::daemon::ThreadMessageSender; use crate::nebulaworker::NebulaWorkerMessage; use crate::socketworker::SocketWorkerMessage; pub enum TimerWorkerMessage { Shutdown } pub fn timer_main(tx: ThreadMessageSender, rx: Receiver) { let mut api_reload_timer = SystemTime::now().add(Duration::from_secs(60)); loop { thread::sleep(Duration::from_secs(10)); match rx.try_recv() { Ok(msg) => { match msg { TimerWorkerMessage::Shutdown => { info!("recv on command socket: shutdown, stopping"); break; } } }, Err(e) => { match e { TryRecvError::Empty => {} TryRecvError::Disconnected => { error!("timerworker command socket disconnected, shutting down to prevent orphaning"); break; } } } } if SystemTime::now().gt(&api_reload_timer) { info!("Timer triggered: API_RELOAD_TIMER"); api_reload_timer = SystemTime::now().add(Duration::from_secs(60)); match tx.api_thread.send(APIWorkerMessage::Timer) { Ok(_) => (), Err(e) => { error!("Error sending timer message to api worker thread: {}", e); } } } match tx.nebula_thread.send(NebulaWorkerMessage::WakeUp) { Ok(_) => (), Err(e) => { error!("Error sending wakeup message to nebula worker thread: {}", e); } } match tx.socket_thread.send(SocketWorkerMessage::WakeUp) { Ok(_) => (), Err(e) => { error!("Error sending wakeup message to socket worker thread: {}", e); } } } }