about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorAndrew <amiller4421@gmail.com>2016-07-08 19:05:10 -0700
committerAndrew <amiller4421@gmail.com>2016-07-08 19:09:51 -0700
commit2af340c0ec72f0033bda65d920ac04ae9e1c0cae (patch)
tree590ec7642be482f5c036663b0a28b843be0c1d19 /src/libstd
parent5e18b4bad8450622aef8e077d3470f5626403588 (diff)
downloadrust-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.rs9
-rw-r--r--src/libstd/sync/mpsc/sync.rs2
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