diff options
| author | bors <bors@rust-lang.org> | 2016-07-10 00:22:33 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-07-10 00:22:33 -0700 |
| commit | 46e7f4b8c5a8c9f66d4d5795aa348307e30f4f0f (patch) | |
| tree | 1cab3f1399e4af5236112126329ca0a2b12522c3 | |
| parent | c73bb9b7d9b5b2f8336683ad7efca7442ad5d379 (diff) | |
| parent | 2af340c0ec72f0033bda65d920ac04ae9e1c0cae (diff) | |
| download | rust-46e7f4b8c5a8c9f66d4d5795aa348307e30f4f0f.tar.gz rust-46e7f4b8c5a8c9f66d4d5795aa348307e30f4f0f.zip | |
Auto merge of #34731 - GGist:fix_sync_try_recv, r=alexcrichton
Check for data in Receiver::try_recv before reporting disconnect Fixes #34711 r? @alexcrichton
| -rw-r--r-- | src/libstd/sync/mpsc/mod.rs | 9 | ||||
| -rw-r--r-- | src/libstd/sync/mpsc/sync.rs | 2 |
2 files changed, 10 insertions, 1 deletions
diff --git a/src/libstd/sync/mpsc/mod.rs b/src/libstd/sync/mpsc/mod.rs index 34bc210b3c8..d96fd6228e6 100644 --- a/src/libstd/sync/mpsc/mod.rs +++ b/src/libstd/sync/mpsc/mod.rs @@ -2181,6 +2181,15 @@ mod sync_tests { } #[test] + fn oneshot_single_thread_try_recv_closed_with_data() { + let (tx, rx) = sync_channel::<i32>(1); + tx.send(10).unwrap(); + drop(tx); + assert_eq!(rx.try_recv(), Ok(10)); + assert_eq!(rx.try_recv(), Err(TryRecvError::Disconnected)); + } + + #[test] fn oneshot_single_thread_peek_data() { let (tx, rx) = sync_channel::<i32>(1); assert_eq!(rx.try_recv(), Err(TryRecvError::Empty)); diff --git a/src/libstd/sync/mpsc/sync.rs b/src/libstd/sync/mpsc/sync.rs index f021689acad..9d13a71ff95 100644 --- a/src/libstd/sync/mpsc/sync.rs +++ b/src/libstd/sync/mpsc/sync.rs @@ -309,7 +309,7 @@ impl<T> Packet<T> { let mut guard = self.lock.lock().unwrap(); // Easy cases first - if guard.disconnected { return Err(Disconnected) } + if guard.disconnected && guard.buf.size() == 0 { return Err(Disconnected) } if guard.buf.size() == 0 { return Err(Empty) } // Be sure to wake up neighbors |
