obeli-sk-wasm-workers 0.26.2

Internal package of obeli-sk
Documentation
use std::{
    sync::{Arc, atomic::AtomicBool},
    time::Duration,
};
use tracing::{debug, info};
use wasmtime::EngineWeak;

pub struct EpochTicker {
    shutdown: Arc<AtomicBool>,
}

impl EpochTicker {
    #[must_use]
    pub fn spawn_new(engines: Vec<EngineWeak>, epoch: Duration) -> Self {
        info!("Spawning the epoch ticker");
        let shutdown = Arc::new(AtomicBool::new(false));
        std::thread::spawn({
            let shutdown = shutdown.clone();
            move || {
                while !shutdown.load(std::sync::atomic::Ordering::Relaxed) {
                    std::thread::sleep(epoch);
                    for engine in &engines {
                        if let Some(engine) = engine.upgrade() {
                            engine.increment_epoch();
                        }
                    }
                }
            }
        });
        Self { shutdown }
    }
}

impl Drop for EpochTicker {
    fn drop(&mut self) {
        debug!("Closing the epoch ticker");
        self.shutdown
            .store(true, std::sync::atomic::Ordering::Relaxed);
    }
}