mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-08-23 00:00:10 +02:00
* Allow customizing the threadpool's parker This patch allows the user of threadpool to customize how the worker threads park themselves. This allows custom parking logic to be injected. For example, this allows embedding a timer on each worker thread. * Call `park` instance every so often. Since the `park` is now customizable, it might have logic that must be called every so often. For example, a timer might have timeouts that it must expire. Currently, if a worker is very busy, it won't call into the `park` instance. This patch changes this so that after every 32 task invocations, `park` is called with a duration of zero.
41 lines
1022 B
Rust
41 lines
1022 B
Rust
use tokio_executor::park::{Park, Unpark};
|
|
|
|
use std::error::Error;
|
|
use std::time::Duration;
|
|
|
|
pub(crate) type BoxPark = Box<Park<Unpark = BoxUnpark, Error = ()> + Send>;
|
|
pub(crate) type BoxUnpark = Box<Unpark>;
|
|
|
|
pub(crate) struct BoxedPark<T>(T);
|
|
|
|
impl<T> BoxedPark<T> {
|
|
pub fn new(inner: T) -> Self {
|
|
BoxedPark(inner)
|
|
}
|
|
}
|
|
|
|
impl<T: Park + Send> Park for BoxedPark<T>
|
|
where T::Error: Error,
|
|
{
|
|
type Unpark = BoxUnpark;
|
|
type Error = ();
|
|
|
|
fn unpark(&self) -> Self::Unpark {
|
|
Box::new(self.0.unpark())
|
|
}
|
|
|
|
fn park(&mut self) -> Result<(), Self::Error> {
|
|
self.0.park()
|
|
.map_err(|e| {
|
|
warn!("calling `park` on worker thread errored -- shutting down thread: {}", e);
|
|
})
|
|
}
|
|
|
|
fn park_timeout(&mut self, duration: Duration) -> Result<(), Self::Error> {
|
|
self.0.park_timeout(duration)
|
|
.map_err(|e| {
|
|
warn!("calling `park` on worker thread errored -- shutting down thread: {}", e);
|
|
})
|
|
}
|
|
}
|