diff options
| author | Andrew <amiller4421@gmail.com> | 2016-07-08 19:05:10 -0700 |
|---|---|---|
| committer | Andrew <amiller4421@gmail.com> | 2016-07-08 19:09:51 -0700 |
| commit | 2af340c0ec72f0033bda65d920ac04ae9e1c0cae (patch) | |
| tree | 590ec7642be482f5c036663b0a28b843be0c1d19 /src/libstd | |
| parent | 5e18b4bad8450622aef8e077d3470f5626403588 (diff) | |
| download | rust-2af340c0ec72f0033bda65d920ac04ae9e1c0cae.tar.gz rust-2af340c0ec72f0033bda65d920ac04ae9e1c0cae.zip | |
Check for data in Receiver::try_recv before reporting disconnect
Diffstat (limited to 'src/libstd')
| -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 |
