diff options
| author | Barosl LEE <github@barosl.com> | 2015-01-21 02:16:47 +0900 |
|---|---|---|
| committer | Barosl LEE <github@barosl.com> | 2015-01-21 02:16:47 +0900 |
| commit | efa8360f98605be755ca0647a6fd5b98bc66e0af (patch) | |
| tree | 71bf49c39aca8aa8698a7c77daabc1cc16bc1646 | |
| parent | b3f6e82beb507eeff94e988308f77224bbfb56f4 (diff) | |
| parent | ffdf1118d5f86b4d55cbf8ec86aa488d9dfc88b2 (diff) | |
| download | rust-efa8360f98605be755ca0647a6fd5b98bc66e0af.tar.gz rust-efa8360f98605be755ca0647a6fd5b98bc66e0af.zip | |
Rollup merge of #21331 - michaelsproul:sync-error-impls, r=alexcrichton
Two errors in `std::sync` are currently missing implementations of the standard error trait because they contain types which aren't `Send`. This PR therefore requires #21312.
| -rw-r--r-- | src/libstd/sync/poison.rs | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/src/libstd/sync/poison.rs b/src/libstd/sync/poison.rs index cc8c331ef39..e28c3c37b6f 100644 --- a/src/libstd/sync/poison.rs +++ b/src/libstd/sync/poison.rs @@ -11,7 +11,7 @@ use prelude::v1::*; use cell::UnsafeCell; -use error::FromError; +use error::{Error, FromError}; use fmt; use thread::Thread; @@ -92,7 +92,13 @@ pub type TryLockResult<Guard> = Result<Guard, TryLockError<Guard>>; impl<T> fmt::Show for PoisonError<T> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - "poisoned lock: another task failed inside".fmt(f) + self.description().fmt(f) + } +} + +impl<T> Error for PoisonError<T> { + fn description(&self) -> &str { + "poisoned lock: another task failed inside" } } @@ -126,11 +132,22 @@ impl<T> FromError<PoisonError<T>> for TryLockError<T> { impl<T> fmt::Show for TryLockError<T> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.description().fmt(f) + } +} + +impl<T> Error for TryLockError<T> { + fn description(&self) -> &str { + match *self { + TryLockError::Poisoned(ref p) => p.description(), + TryLockError::WouldBlock => "try_lock failed because the operation would block" + } + } + + fn cause(&self) -> Option<&Error> { match *self { - TryLockError::Poisoned(ref p) => p.fmt(f), - TryLockError::WouldBlock => { - "try_lock failed because the operation would block".fmt(f) - } + TryLockError::Poisoned(ref p) => Some(p), + _ => None } } } |
