#[cfg(not(crossbeam_sanitize))] // TODO: assertions failed due to tsan is slow #[test] fn recv_timeout() { let start = Instant::now(); let r = tick(ms(200));
assert!(r.recv_timeout(ms(100)).is_err()); let now = Instant::now();
assert!(now - start >= ms(100));
assert!(now - start <= ms(150));
let hits = AtomicUsize::new(0); let r1 = tick(ms(200)); let r2 = tick(ms(300));
scope(|scope| { for _ in0..THREADS {
scope.spawn(|_| { let timeout = after(ms(1100)); loop { letmut sel = Select::new(); let oper1 = sel.recv(&r1); let oper2 = sel.recv(&r2); let oper3 = sel.recv(&timeout); let oper = sel.select(); match oper.index() {
i if i == oper1 => {
oper.recv(&r1).unwrap();
hits.fetch_add(1, Ordering::SeqCst);
}
i if i == oper2 => {
oper.recv(&r2).unwrap();
hits.fetch_add(1, Ordering::SeqCst);
}
i if i == oper3 => {
oper.recv(&timeout).unwrap(); break;
}
_ => unreachable!(),
}
}
});
}
})
.unwrap();
assert_eq!(hits.load(Ordering::SeqCst), 8);
}
#[cfg(not(crossbeam_sanitize))] // TODO: assertions failed due to tsan is slow #[test] fn ready() { const THREADS: usize = 4;
let hits = AtomicUsize::new(0); let r1 = tick(ms(200)); let r2 = tick(ms(300));
scope(|scope| { for _ in0..THREADS {
scope.spawn(|_| { let timeout = after(ms(1100)); 'outer: loop { letmut sel = Select::new();
sel.recv(&r1);
sel.recv(&r2);
sel.recv(&timeout); loop { match sel.ready() { 0 => { if r1.try_recv().is_ok() {
hits.fetch_add(1, Ordering::SeqCst); break;
}
} 1 => { if r2.try_recv().is_ok() {
hits.fetch_add(1, Ordering::SeqCst); break;
}
} 2 => { if timeout.try_recv().is_ok() { break'outer;
}
}
_ => unreachable!(),
}
}
}
});
}
})
.unwrap();
assert_eq!(hits.load(Ordering::SeqCst), 8);
}
#[test] fn fairness() { const COUNT: usize = 30;
for &dur in &[0, 1] { letmut hits = [0usize; 2];
for _ in0..COUNT { let r1 = tick(ms(dur)); let r2 = tick(ms(dur));
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.