32 lines
925 B
Rust
32 lines
925 B
Rust
|
use rayon::prelude::*;
|
||
|
use std::iter::once_with;
|
||
|
|
||
|
const N: usize = 100_000;
|
||
|
|
||
|
#[test]
|
||
|
#[cfg_attr(any(target_os = "emscripten", target_family = "wasm"), ignore)]
|
||
|
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);
|
||
|
});
|
||
|
}
|