Files
David Tolnay c4be25da77 Change test suite atomic from SeqCst to Relaxed
These atomics are not synchronizing anything outside of their own value,
so we don't need the Acquire/Release guarantee that all memory
operations prior to the store are visible after the subsequent load, nor
the SeqCst guarantee of all threads seeing all of the sequentially
consistent operations in the same order.
2021-12-23 10:59:07 -08:00

53 lines
1.6 KiB
Rust

#![cfg(exhaustive)]
use std::str;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
use std::thread;
#[test]
fn test_exhaustive() {
const BATCH_SIZE: u32 = 1_000_000;
let counter = Arc::new(AtomicUsize::new(0));
let finished = Arc::new(AtomicUsize::new(0));
let mut workers = Vec::new();
for _ in 0..num_cpus::get() {
let counter = counter.clone();
let finished = finished.clone();
workers.push(thread::spawn(move || loop {
let batch = counter.fetch_add(1, Ordering::Relaxed) as u32;
if batch > u32::max_value() / BATCH_SIZE {
return;
}
let min = batch * BATCH_SIZE;
let max = if batch == u32::max_value() / BATCH_SIZE {
u32::max_value()
} else {
min + BATCH_SIZE - 1
};
let mut bytes = [0u8; 24];
let mut buffer = ryu::Buffer::new();
for u in min..=max {
let f = f32::from_bits(u);
if !f.is_finite() {
continue;
}
let n = unsafe { ryu::raw::format32(f, &mut bytes[0]) };
assert_eq!(Ok(Ok(f)), str::from_utf8(&bytes[..n]).map(str::parse));
assert_eq!(Ok(f), buffer.format_finite(f).parse());
}
let increment = (max - min + 1) as usize;
let update = finished.fetch_add(increment, Ordering::Relaxed);
println!("{}", update + increment);
}));
}
for w in workers {
w.join().unwrap();
}
}