1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
use tokio_executor::park::{Park, Unpark}; use std::error::Error; use std::time::Duration; pub(crate) type BoxPark = Box<dyn Park<Unpark = BoxUnpark, Error = ()> + Send>; pub(crate) type BoxUnpark = Box<dyn 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 ); }) } }