//! A thin wrapper around `ThreadPool` to make sure that we join all things //! properly. use crossbeam_channel::Sender; pub(crate) struct TaskPool { sender: Sender, inner: threadpool::ThreadPool, } impl TaskPool { pub(crate) fn new(sender: Sender) -> TaskPool { TaskPool { sender, inner: threadpool::ThreadPool::default() } } pub(crate) fn spawn(&mut self, task: F) where F: FnOnce() -> T + Send + 'static, T: Send + 'static, { self.inner.execute({ let sender = self.sender.clone(); move || sender.send(task()).unwrap() }) } pub(crate) fn spawn_with_sender(&mut self, task: F) where F: FnOnce(Sender) + Send + 'static, T: Send + 'static, { self.inner.execute({ let sender = self.sender.clone(); move || task(sender) }) } pub(crate) fn len(&self) -> usize { self.inner.queued_count() } } impl Drop for TaskPool { fn drop(&mut self) { self.inner.join() } }