about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/rt/comm.rs16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/libstd/rt/comm.rs b/src/libstd/rt/comm.rs
index 87bf5a23b93..6528835c52c 100644
--- a/src/libstd/rt/comm.rs
+++ b/src/libstd/rt/comm.rs
@@ -180,11 +180,25 @@ impl<T> PortOne<T> {
 }
 
 impl<T> Select for PortOne<T> {
-    #[inline]
+    #[inline] #[cfg(not(test))]
     fn optimistic_check(&mut self) -> bool {
         unsafe { (*self.packet()).state.load(Acquire) == STATE_ONE }
     }
 
+    #[inline] #[cfg(test)]
+    fn optimistic_check(&mut self) -> bool {
+        // The optimistic check is never necessary for correctness. For testing
+        // purposes, making it randomly return false simulates a racing sender.
+        use rand::{Rand, rng};
+        let mut rng = rng();
+        let actually_check = Rand::rand(&mut rng);
+        if actually_check {
+            unsafe { (*self.packet()).state.load(Acquire) == STATE_ONE }
+        } else {
+            false
+        }
+    }
+
     fn block_on(&mut self, sched: &mut Scheduler, task: BlockedTask) -> bool {
         unsafe {
             // Atomically swap the task pointer into the Packet state, issuing