| 1 | use rayon::prelude::*; |
| 2 | use rayon::ThreadPoolBuilder; |
| 3 | |
| 4 | #[test] |
| 5 | #[cfg_attr (any(target_os = "emscripten" , target_family = "wasm" ), ignore)] |
| 6 | fn cross_pool_busy() { |
| 7 | let pool1 = ThreadPoolBuilder::new().num_threads(1).build().unwrap(); |
| 8 | let pool2 = ThreadPoolBuilder::new().num_threads(1).build().unwrap(); |
| 9 | |
| 10 | let n: i32 = 100; |
| 11 | let sum: i32 = pool1.install(move || { |
| 12 | // Each item will block on pool2, but pool1 can continue processing other work from the |
| 13 | // parallel iterator in the meantime. There's a chance that pool1 will still be awake to |
| 14 | // see the latch set without being tickled, and then it will drop that stack job. The latch |
| 15 | // internals must not assume that the job will still be alive after it's set! |
| 16 | (1..=n) |
| 17 | .into_par_iter() |
| 18 | .map(|i| pool2.install(move || i)) |
| 19 | .sum() |
| 20 | }); |
| 21 | assert_eq!(sum, n * (n + 1) / 2); |
| 22 | } |
| 23 | |