Add std::hint::spin_loop()

This commit is contained in:
Patrick-6 2025-07-15 10:32:19 +02:00
parent 3c3f1e461c
commit e1d35c551f
3 changed files with 22 additions and 6 deletions

View file

@ -48,6 +48,14 @@ fn loads_value(loc: &AtomicI32, ord: Ordering, val: i32) -> i32 {
val
}
/// Spins until it acquires a pre-determined boolean.
fn loads_bool(loc: &AtomicBool, ord: Ordering, val: bool) -> bool {
while loc.load(ord) != val {
std::hint::spin_loop();
}
val
}
fn test_corr() {
let x = static_atomic(0);
let y = static_atomic(0);
@ -216,12 +224,12 @@ fn test_sync_through_rmw_and_fences() {
let go = static_atomic_bool(false);
let t1 = spawn(move || {
while !go.load(Relaxed) {}
loads_bool(go, Relaxed, true);
rdmw(y, x, z)
});
let t2 = spawn(move || {
while !go.load(Relaxed) {}
loads_bool(go, Relaxed, true);
rdmw(z, x, y)
});

View file

@ -27,6 +27,14 @@ fn loads_value(loc: &AtomicI32, ord: Ordering, val: i32) -> i32 {
val
}
/// Spins until it acquires a pre-determined boolean.
fn loads_bool(loc: &AtomicBool, ord: Ordering, val: bool) -> bool {
while loc.load(ord) != val {
std::hint::spin_loop();
}
val
}
// Test case SB taken from Repairing Sequential Consistency in C/C++11
// by Lahav et al.
// https://plv.mpi-sws.org/scfix/paper.pdf
@ -60,11 +68,11 @@ fn test_iriw_sc_rlx() {
let a = spawn(move || x.store(true, Relaxed));
let b = spawn(move || y.store(true, Relaxed));
let c = spawn(move || {
while !x.load(SeqCst) {}
loads_bool(x, SeqCst, true);
y.load(SeqCst)
});
let d = spawn(move || {
while !y.load(SeqCst) {}
loads_bool(y, SeqCst, true);
x.load(SeqCst)
});

View file

@ -119,12 +119,12 @@ fn faa_replaced_by_load() -> bool {
let go = static_atomic(0);
let t1 = spawn(move || {
while go.load(Relaxed) == 0 {}
reads_value(go, 1);
rdmw(y, x, z)
});
let t2 = spawn(move || {
while go.load(Relaxed) == 0 {}
reads_value(go, 1);
rdmw(z, x, y)
});