]> git.lizzy.rs Git - rust.git/blob - crates/rust-analyzer/src/task_pool.rs
83389373903221fae63de9f15b88336076a759a4
[rust.git] / crates / rust-analyzer / src / task_pool.rs
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> {
11     pub(crate) fn new(sender: Sender<T>) -> TaskPool<T> {
12         TaskPool { sender, inner: threadpool::ThreadPool::default() }
13     }
14
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
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
37     pub(crate) fn len(&self) -> usize {
38         self.inner.queued_count()
39     }
40 }
41
42 impl<T> Drop for TaskPool<T> {
43     fn drop(&mut self) {
44         self.inner.join()
45     }
46 }