diff --git a/benches/iai.rs b/benches/iai.rs index 630efde..c11f2b5 100644 --- a/benches/iai.rs +++ b/benches/iai.rs @@ -37,8 +37,6 @@ macro_rules! single_thread_bench_iai { } } -static ITERATIONS_LEFT: AtomicU64 = AtomicU64::new(0); - macro_rules! contended_bench_iai { ($n:expr) => { contended_bench_iai!($n, num_cpus::get_physical()); @@ -46,7 +44,7 @@ macro_rules! contended_bench_iai { ($n:expr, $threads:expr) => { paste! { fn [< contended_bench_ $n _shared_buffer >]() { - ITERATIONS_LEFT.store(2 * RESEEDING_THRESHOLD * $n.max(1), SeqCst); + let iterations_left = Arc::new(AtomicU64::new(2 * RESEEDING_THRESHOLD * $n.max(1))); let root = BenchmarkSharedBufferRng::<$n>::new(OsRng::default()); let rngs: Vec<_> = (0..$threads) .map(|_| root.new_standard_rng(RESEEDING_THRESHOLD)) @@ -55,23 +53,21 @@ macro_rules! contended_bench_iai { drop(root); let background_threads: Vec<_> = rngs.into_iter() .map(|mut rng| { + let iterations_left = iterations_left.clone(); spawn(move || { - while ITERATIONS_LEFT.fetch_sub(1, SeqCst) > 0 { + while iterations_left.fetch_sub(1, SeqCst) > 0 { black_box(rng.next_u64()); } }) }) .collect(); - while ITERATIONS_LEFT.fetch_sub(1, SeqCst) > 0 { + while iterations_left.fetch_sub(1, SeqCst) > 0 { black_box(main_thread_rng.next_u64()); } - background_threads - .into_iter() - .for_each(|handle| handle.join().unwrap()); } fn [< contended_bench_ $n _local_buffer >]() { - ITERATIONS_LEFT.store(2 * RESEEDING_THRESHOLD * $n.max(1), SeqCst); + let iterations_left = Arc::new(AtomicU64::new(2 * RESEEDING_THRESHOLD * $n.max(1))); let rngs: Vec<_> = (0..$threads) .map(|_| { let mut buffer = BlockRng64::new(RngBufferCore::<$n, OsRng>(OsRng::default())); @@ -83,6 +79,7 @@ macro_rules! contended_bench_iai { let main_thread_rng = rngs.pop().unwrap(); let background_threads: Vec<_> = rngs.into_iter() .map(|mut rng| { + let iterations_left = iterations_left.clone(); spawn(move || { while ITERATIONS_LEFT.fetch_sub(1, SeqCst) > 0 { black_box(rng.next_u64()); @@ -90,12 +87,9 @@ macro_rules! contended_bench_iai { }) }) .collect(); - while ITERATIONS_LEFT.fetch_sub(1, SeqCst) > 0 { + while iterations_left.fetch_sub(1, SeqCst) > 0 { black_box(main_thread_rng.next_u64()); } - background_threads - .into_iter() - .for_each(|handle| handle.join().unwrap()); } } };