22
33
44use std:: sync:: atomic:: { AtomicUsize , fence, Ordering } ;
5- use std:: thread:: spawn;
5+ use std:: thread:: { spawn, yield_now } ;
66
77#[ derive( Copy , Clone ) ]
88struct EvilSend < T > ( pub T ) ;
@@ -12,6 +12,21 @@ unsafe impl<T> Sync for EvilSend<T> {}
1212
1313static 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+
1530fn 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