diff options
| author | bors <bors@rust-lang.org> | 2017-11-29 12:17:45 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-11-29 12:17:45 +0000 |
| commit | 0a2e9ade83ff253bb489c63a95b1f499c5e0916f (patch) | |
| tree | 6fe2c8003b84d6e710ad6d57b77427b66b9c4ad4 /src/libstd/sync | |
| parent | dc0e227745765c198958f0298785d18bcf61d4ae (diff) | |
| parent | 51bd916af49dff0e88cf3cd01d507aa5fabc6cf8 (diff) | |
| download | rust-0a2e9ade83ff253bb489c63a95b1f499c5e0916f.tar.gz rust-0a2e9ade83ff253bb489c63a95b1f499c5e0916f.zip | |
Auto merge of #46362 - kennytm:rollup, r=kennytm
Rollup of 10 pull requests - Successful merges: #45969, #46077, #46219, #46287, #46293, #46322, #46323, #46330, #46354, #46356 - Failed merges:
Diffstat (limited to 'src/libstd/sync')
| -rw-r--r-- | src/libstd/sync/mpsc/mod.rs | 71 | ||||
| -rw-r--r-- | src/libstd/sync/once.rs | 1 |
2 files changed, 66 insertions, 6 deletions
diff --git a/src/libstd/sync/mpsc/mod.rs b/src/libstd/sync/mpsc/mod.rs index 8d7f60f9d2c..2dd3aebe610 100644 --- a/src/libstd/sync/mpsc/mod.rs +++ b/src/libstd/sync/mpsc/mod.rs @@ -1297,11 +1297,72 @@ impl<T> Receiver<T> { Err(TryRecvError::Disconnected) => Err(RecvTimeoutError::Disconnected), Err(TryRecvError::Empty) - => self.recv_max_until(Instant::now() + timeout) + => self.recv_deadline(Instant::now() + timeout) } } - fn recv_max_until(&self, deadline: Instant) -> Result<T, RecvTimeoutError> { + /// Attempts to wait for a value on this receiver, returning an error if the + /// corresponding channel has hung up, or if `deadline` is reached. + /// + /// This function will always block the current thread if there is no data + /// available and it's possible for more data to be sent. Once a message is + /// sent to the corresponding [`Sender`][] (or [`SyncSender`]), then this + /// receiver will wake up and return that message. + /// + /// If the corresponding [`Sender`] has disconnected, or it disconnects while + /// this call is blocking, this call will wake up and return [`Err`] to + /// indicate that no more messages can ever be received on this channel. + /// However, since channels are buffered, messages sent before the disconnect + /// will still be properly received. + /// + /// [`Sender`]: struct.Sender.html + /// [`SyncSender`]: struct.SyncSender.html + /// [`Err`]: ../../../std/result/enum.Result.html#variant.Err + /// + /// # Examples + /// + /// Successfully receiving value before reaching deadline: + /// + /// ```no_run + /// #![feature(deadline_api)] + /// use std::thread; + /// use std::time::{Duration, Instant}; + /// use std::sync::mpsc; + /// + /// let (send, recv) = mpsc::channel(); + /// + /// thread::spawn(move || { + /// send.send('a').unwrap(); + /// }); + /// + /// assert_eq!( + /// recv.recv_deadline(Instant::now() + Duration::from_millis(400)), + /// Ok('a') + /// ); + /// ``` + /// + /// Receiving an error upon reaching deadline: + /// + /// ```no_run + /// #![feature(deadline_api)] + /// use std::thread; + /// use std::time::{Duration, Instant}; + /// use std::sync::mpsc; + /// + /// let (send, recv) = mpsc::channel(); + /// + /// thread::spawn(move || { + /// thread::sleep(Duration::from_millis(800)); + /// send.send('a').unwrap(); + /// }); + /// + /// assert_eq!( + /// recv.recv_deadline(Instant::now() + Duration::from_millis(400)), + /// Err(mpsc::RecvTimeoutError::Timeout) + /// ); + /// ``` + #[unstable(feature = "deadline_api", issue = "46316")] + pub fn recv_deadline(&self, deadline: Instant) -> Result<T, RecvTimeoutError> { use self::RecvTimeoutError::*; loop { @@ -1625,7 +1686,7 @@ impl<T: Send> error::Error for TrySendError<T> { } } -#[stable(feature = "mpsc_error_conversions", since = "1.23.0")] +#[stable(feature = "mpsc_error_conversions", since = "1.24.0")] impl<T> From<SendError<T>> for TrySendError<T> { fn from(err: SendError<T>) -> TrySendError<T> { match err { @@ -1686,7 +1747,7 @@ impl error::Error for TryRecvError { } } -#[stable(feature = "mpsc_error_conversions", since = "1.23.0")] +#[stable(feature = "mpsc_error_conversions", since = "1.24.0")] impl From<RecvError> for TryRecvError { fn from(err: RecvError) -> TryRecvError { match err { @@ -1727,7 +1788,7 @@ impl error::Error for RecvTimeoutError { } } -#[stable(feature = "mpsc_error_conversions", since = "1.23.0")] +#[stable(feature = "mpsc_error_conversions", since = "1.24.0")] impl From<RecvError> for RecvTimeoutError { fn from(err: RecvError) -> RecvTimeoutError { match err { diff --git a/src/libstd/sync/once.rs b/src/libstd/sync/once.rs index 2ef99525af5..6fd8b6a5bba 100644 --- a/src/libstd/sync/once.rs +++ b/src/libstd/sync/once.rs @@ -156,7 +156,6 @@ struct Finish { impl Once { /// Creates a new `Once` value. #[stable(feature = "once_new", since = "1.2.0")] - #[rustc_const_unstable(feature = "const_once_new")] pub const fn new() -> Once { Once { state: AtomicUsize::new(INCOMPLETE), |
