diff options
Diffstat (limited to 'third_party/rust/tokio-threadpool/src/park')
-rw-r--r-- | third_party/rust/tokio-threadpool/src/park/boxed.rs | 45 | ||||
-rw-r--r-- | third_party/rust/tokio-threadpool/src/park/default_park.rs | 97 | ||||
-rw-r--r-- | third_party/rust/tokio-threadpool/src/park/mod.rs | 8 |
3 files changed, 150 insertions, 0 deletions
diff --git a/third_party/rust/tokio-threadpool/src/park/boxed.rs b/third_party/rust/tokio-threadpool/src/park/boxed.rs new file mode 100644 index 0000000000..030866450d --- /dev/null +++ b/third_party/rust/tokio-threadpool/src/park/boxed.rs @@ -0,0 +1,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 + ); + }) + } +} diff --git a/third_party/rust/tokio-threadpool/src/park/default_park.rs b/third_party/rust/tokio-threadpool/src/park/default_park.rs new file mode 100644 index 0000000000..ecc22350f0 --- /dev/null +++ b/third_party/rust/tokio-threadpool/src/park/default_park.rs @@ -0,0 +1,97 @@ +use tokio_executor::park::{Park, Unpark}; + +use std::error::Error; +use std::fmt; +use std::time::Duration; + +use crossbeam_utils::sync::{Parker, Unparker}; + +/// Parks the thread. +#[derive(Debug)] +pub struct DefaultPark { + inner: Parker, +} + +/// Unparks threads that were parked by `DefaultPark`. +#[derive(Debug)] +pub struct DefaultUnpark { + inner: Unparker, +} + +/// Error returned by [`ParkThread`] +/// +/// This currently is never returned, but might at some point in the future. +/// +/// [`ParkThread`]: struct.ParkThread.html +#[derive(Debug)] +pub struct ParkError { + _p: (), +} + +// ===== impl DefaultPark ===== + +impl DefaultPark { + /// Creates a new `DefaultPark` instance. + pub fn new() -> DefaultPark { + DefaultPark { + inner: Parker::new(), + } + } + + /// Unpark the thread without having to clone the unpark handle. + /// + /// Named `notify` to avoid conflicting with the `unpark` fn. + pub(crate) fn notify(&self) { + self.inner.unparker().unpark(); + } + + pub(crate) fn park_sync(&self, duration: Option<Duration>) { + match duration { + None => self.inner.park(), + Some(duration) => self.inner.park_timeout(duration), + } + } +} + +impl Park for DefaultPark { + type Unpark = DefaultUnpark; + type Error = ParkError; + + fn unpark(&self) -> Self::Unpark { + DefaultUnpark { + inner: self.inner.unparker().clone(), + } + } + + fn park(&mut self) -> Result<(), Self::Error> { + self.inner.park(); + Ok(()) + } + + fn park_timeout(&mut self, duration: Duration) -> Result<(), Self::Error> { + self.inner.park_timeout(duration); + Ok(()) + } +} + +// ===== impl DefaultUnpark ===== + +impl Unpark for DefaultUnpark { + fn unpark(&self) { + self.inner.unpark(); + } +} + +// ===== impl ParkError ===== + +impl fmt::Display for ParkError { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + self.description().fmt(fmt) + } +} + +impl Error for ParkError { + fn description(&self) -> &str { + "unknown park error" + } +} diff --git a/third_party/rust/tokio-threadpool/src/park/mod.rs b/third_party/rust/tokio-threadpool/src/park/mod.rs new file mode 100644 index 0000000000..e7c5f40d36 --- /dev/null +++ b/third_party/rust/tokio-threadpool/src/park/mod.rs @@ -0,0 +1,8 @@ +//! Thread parking utilities. + +mod boxed; +mod default_park; + +pub use self::default_park::{DefaultPark, DefaultUnpark, ParkError}; + +pub(crate) use self::boxed::{BoxPark, BoxUnpark, BoxedPark}; |