Skip to content

Commit

Permalink
Check for data in Receiver::try_recv before reporting disconnect
Browse files Browse the repository at this point in the history
  • Loading branch information
GGist committed Jul 9, 2016
1 parent 5e18b4b commit 2af340c
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 1 deletion.
9 changes: 9 additions & 0 deletions src/libstd/sync/mpsc/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2180,6 +2180,15 @@ mod sync_tests {
assert!(rx.recv().is_err());
}

#[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);
Expand Down
2 changes: 1 addition & 1 deletion src/libstd/sync/mpsc/sync.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 2af340c

Please sign in to comment.