From fb90e4c7b69dec797d036dc0aac802d9b2a18198 Mon Sep 17 00:00:00 2001 From: Andrew Paseltiner Date: Sat, 1 Oct 2016 08:39:11 -0400 Subject: [PATCH] Restore `DISCONNECTED` state in `oneshot::Packet::send` Closes #32114 --- src/libstd/sync/mpsc/mod.rs | 7 +++++++ src/libstd/sync/mpsc/oneshot.rs | 2 ++ 2 files changed, 9 insertions(+) diff --git a/src/libstd/sync/mpsc/mod.rs b/src/libstd/sync/mpsc/mod.rs index d9c14ef2f771e..6d37f1605901a 100644 --- a/src/libstd/sync/mpsc/mod.rs +++ b/src/libstd/sync/mpsc/mod.rs @@ -1940,6 +1940,13 @@ mod tests { // wait for the child thread to exit before we exit rx2.recv().unwrap(); } + + #[test] + fn issue_32114() { + let (tx, _) = channel(); + let _ = tx.send(123); + assert_eq!(tx.send(123), Err(SendError(123))); + } } #[cfg(all(test, not(target_os = "emscripten")))] diff --git a/src/libstd/sync/mpsc/oneshot.rs b/src/libstd/sync/mpsc/oneshot.rs index 7389280b853db..767e9f96ac8e4 100644 --- a/src/libstd/sync/mpsc/oneshot.rs +++ b/src/libstd/sync/mpsc/oneshot.rs @@ -113,6 +113,8 @@ impl Packet { // Couldn't send the data, the port hung up first. Return the data // back up the stack. DISCONNECTED => { + self.state.swap(DISCONNECTED, Ordering::SeqCst); + self.upgrade = NothingSent; Err(self.data.take().unwrap()) }