threadpool: refactor pool shutdown (#769)

This commit is contained in:
Stjepan Glavina
2018-11-20 21:43:23 +01:00
committed by GitHub
parent 9c037044c4
commit 3235749006
7 changed files with 162 additions and 127 deletions
+27 -20
View File
@@ -1,7 +1,7 @@
use callback::Callback;
use config::{Config, MAX_WORKERS};
use park::{BoxPark, BoxedPark, DefaultPark};
use sender::Sender;
use shutdown::ShutdownTrigger;
use pool::{Pool, MAX_BACKUP};
use thread_pool::ThreadPool;
use worker::{self, Worker, WorkerId};
@@ -396,31 +396,38 @@ impl Builder {
/// # }
/// ```
pub fn build(&self) -> ThreadPool {
let mut workers = vec![];
trace!("build; num-workers={}", self.pool_size);
for i in 0..self.pool_size {
let id = WorkerId::new(i);
let park = (self.new_park)(&id);
let unpark = park.unpark();
// Create the worker entry list
let workers: Arc<[worker::Entry]> = {
let mut workers = vec![];
workers.push(worker::Entry::new(park, unpark));
}
for i in 0..self.pool_size {
let id = WorkerId::new(i);
let park = (self.new_park)(&id);
let unpark = park.unpark();
workers.push(worker::Entry::new(park, unpark));
}
workers.into()
};
// Create a trigger that will clean up resources on shutdown.
//
// The `Pool` contains a weak reference to it, while `Worker`s and the `ThreadPool` contain
// strong references.
let trigger = Arc::new(ShutdownTrigger::new(workers.clone()));
// Create the pool
let pool = Arc::new(
Pool::new(
workers.into_boxed_slice(),
self.max_blocking,
self.config.clone()));
let pool = Arc::new(Pool::new(
workers,
Arc::downgrade(&trigger),
self.max_blocking,
self.config.clone(),
));
// Wrap with `Sender`
let sender = Some(Sender {
pool
});
ThreadPool { sender }
ThreadPool::new2(pool, trigger)
}
}