use std::marker::PhantomData; use std::sync::mpsc::{channel as mpsc_channel, Sender as MpscSender}; use std::thread::JoinHandle as ThreadHandle; pub struct Work { pub func: fn(UserData), pub user_data: UserData, } #[derive(Debug)] pub struct WorkQueue { work_sender: MpscSender>, _thread: ThreadHandle<()>, _pd: PhantomData, } impl WorkQueue { pub fn new() -> Self { let (work_sender, work_receiver) = mpsc_channel::>(); Self { work_sender, _thread: std::thread::spawn(move || { let work_receiver = work_receiver; while let Ok(work) = work_receiver.recv() { (work.func)(work.user_data); } }), _pd: PhantomData, } } pub fn add_work(&self, work: Work) { if self.work_sender.send(work).is_err() { tracing::error!("Cannot add work to work queue. Work queue thread is dead"); } } }