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