| use crate::sync::mpsc::{channel, TryRecvError}; |
| use crate::sync::{Arc, Barrier}; |
| use crate::thread; |
| |
| #[test] |
| #[cfg_attr(target_os = "emscripten", ignore)] |
| fn test_barrier() { |
| const N: usize = 10; |
| |
| let barrier = Arc::new(Barrier::new(N)); |
| let (tx, rx) = channel(); |
| |
| for _ in 0..N - 1 { |
| let c = barrier.clone(); |
| let tx = tx.clone(); |
| thread::spawn(move || { |
| tx.send(c.wait().is_leader()).unwrap(); |
| }); |
| } |
| |
| // At this point, all spawned threads should be blocked, |
| // so we shouldn't get anything from the port |
| assert!(matches!(rx.try_recv(), Err(TryRecvError::Empty))); |
| |
| let mut leader_found = barrier.wait().is_leader(); |
| |
| // Now, the barrier is cleared and we should get data. |
| for _ in 0..N - 1 { |
| if rx.recv().unwrap() { |
| assert!(!leader_found); |
| leader_found = true; |
| } |
| } |
| assert!(leader_found); |
| } |