Skip to content

Commit c0be33b

Browse files
committed
Fix data race tests to work with weak memory
1 parent acf696b commit c0be33b

File tree

1 file changed

+25
-19
lines changed

1 file changed

+25
-19
lines changed

tests/run-pass/concurrency/data_race.rs

+25-19
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33

44
use std::sync::atomic::{AtomicUsize, fence, Ordering};
5-
use std::thread::spawn;
5+
use std::thread::{spawn, yield_now};
66

77
#[derive(Copy, Clone)]
88
struct EvilSend<T>(pub T);
@@ -12,6 +12,21 @@ unsafe impl<T> Sync for EvilSend<T> {}
1212

1313
static SYNC: AtomicUsize = AtomicUsize::new(0);
1414

15+
// Spins and yields until until acquires a pre-determined value
16+
fn acquires_value(loc: &AtomicUsize, val: usize) -> usize {
17+
while loc.load(Ordering::Acquire) != val {
18+
yield_now();
19+
}
20+
val
21+
}
22+
23+
fn reads_value(loc: &AtomicUsize, val: usize) -> usize {
24+
while loc.load(Ordering::Relaxed) != val {
25+
yield_now();
26+
}
27+
val
28+
}
29+
1530
fn test_fence_sync() {
1631
let mut var = 0u32;
1732
let ptr = &mut var as *mut u32;
@@ -25,12 +40,9 @@ fn test_fence_sync() {
2540
});
2641

2742
let j2 = spawn(move || {
28-
if SYNC.load(Ordering::Relaxed) == 1 {
29-
fence(Ordering::Acquire);
30-
unsafe { *evil_ptr.0 }
31-
} else {
32-
0
33-
}
43+
reads_value(&SYNC, 1);
44+
fence(Ordering::Acquire);
45+
unsafe { *evil_ptr.0 }
3446
});
3547

3648
j1.join().unwrap();
@@ -69,23 +81,20 @@ pub fn test_rmw_no_block() {
6981
});
7082

7183
let j2 = spawn(move || {
72-
if SYNC.swap(2, Ordering::Relaxed) == 1 {
84+
while SYNC.swap(2, Ordering::Relaxed) != 1 {
7385
//No op, blocking store removed
7486
}
7587
});
7688

7789
let j3 = spawn(move || {
78-
if SYNC.load(Ordering::Acquire) == 2 {
79-
*c.0
80-
} else {
81-
0
82-
}
90+
acquires_value(&SYNC, 2);
91+
*c.0
8392
});
8493

8594
j1.join().unwrap();
8695
j2.join().unwrap();
8796
let v = j3.join().unwrap();
88-
assert!(v == 1 || v == 2);
97+
assert!(v == 1);
8998
}
9099
}
91100

@@ -101,11 +110,8 @@ pub fn test_simple_release() {
101110
});
102111

103112
let j2 = spawn(move || {
104-
if SYNC.load(Ordering::Acquire) == 1 {
105-
*c.0
106-
} else {
107-
0
108-
}
113+
acquires_value(&SYNC, 1);
114+
*c.0
109115
});
110116

111117
j1.join().unwrap();

0 commit comments

Comments
 (0)