1 //! A thin wrapper around `ThreadPool` to make sure that we join all things 2 //! properly. 3 use crossbeam_channel::Sender; 4 5 pub(crate) struct TaskPool<T> { 6 sender: Sender<T>, 7 inner: threadpool::ThreadPool, 8 } 9 10 impl<T> TaskPool<T> { new(sender: Sender<T>) -> TaskPool<T>11 pub(crate) fn new(sender: Sender<T>) -> TaskPool<T> { 12 TaskPool { sender, inner: threadpool::ThreadPool::default() } 13 } 14 spawn<F>(&mut self, task: F) where F: FnOnce() -> T + Send + 'static, T: Send + 'static,15 pub(crate) fn spawn<F>(&mut self, task: F) 16 where 17 F: FnOnce() -> T + Send + 'static, 18 T: Send + 'static, 19 { 20 self.inner.execute({ 21 let sender = self.sender.clone(); 22 move || sender.send(task()).unwrap() 23 }) 24 } 25 spawn_with_sender<F>(&mut self, task: F) where F: FnOnce(Sender<T>) + Send + 'static, T: Send + 'static,26 pub(crate) fn spawn_with_sender<F>(&mut self, task: F) 27 where 28 F: FnOnce(Sender<T>) + Send + 'static, 29 T: Send + 'static, 30 { 31 self.inner.execute({ 32 let sender = self.sender.clone(); 33 move || task(sender) 34 }) 35 } 36 len(&self) -> usize37 pub(crate) fn len(&self) -> usize { 38 self.inner.queued_count() 39 } 40 } 41 42 impl<T> Drop for TaskPool<T> { drop(&mut self)43 fn drop(&mut self) { 44 self.inner.join() 45 } 46 } 47