forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			30 lines
		
	
	
	
		
			850 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			30 lines
		
	
	
	
		
			850 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use rayon::prelude::*;
 | |
| use std::iter::once_with;
 | |
| 
 | |
| const N: usize = 100_000;
 | |
| 
 | |
| #[test]
 | |
| fn par_bridge_recursion() {
 | |
|     let pool = rayon::ThreadPoolBuilder::new()
 | |
|         .num_threads(10)
 | |
|         .build()
 | |
|         .unwrap();
 | |
| 
 | |
|     let seq: Vec<_> = (0..N).map(|i| (i, i.to_string())).collect();
 | |
| 
 | |
|     pool.broadcast(|_| {
 | |
|         let mut par: Vec<_> = (0..N)
 | |
|             .into_par_iter()
 | |
|             .flat_map(|i| {
 | |
|                 once_with(move || {
 | |
|                     // Using rayon within the serial iterator creates an opportunity for
 | |
|                     // work-stealing to make par_bridge's mutex accidentally recursive.
 | |
|                     rayon::join(move || i, move || i.to_string())
 | |
|                 })
 | |
|                 .par_bridge()
 | |
|             })
 | |
|             .collect();
 | |
|         par.par_sort_unstable();
 | |
|         assert_eq!(seq, par);
 | |
|     });
 | |
| }
 | 
