diff options
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/rt/comm.rs | 16 |
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 |
