v2 / vlib / x / atomics / u32_test.v
210 lines · 176 sloc · 3.03 KB · 1c4bb916e5cdf6aecbc6c6315f95453a9e8778f3
Raw
1// vtest build: !(macos || windows)
2
3module atomics
4
5fn test_add_u32_basic() {
6 mut x := u32(0)
7 for _ in 0 .. 1000 {
8 add_u32(&x, 1)
9 }
10 assert x == 1000
11}
12
13fn test_add_u32_wraparound() {
14 mut x := u32(0xffffffff)
15 add_u32(&x, 1)
16 assert x == 0
17}
18
19fn test_add_u32_large() {
20 mut x := u32(10)
21 r := add_u32(&x, 1000)
22 assert r == 1010
23 assert x == 1010
24}
25
26fn test_swap_u32_basic() {
27 mut x := u32(123)
28 old := swap_u32(&x, 999)
29 assert old == 123
30 assert x == 999
31}
32
33fn test_swap_u32_same() {
34 mut x := u32(777)
35 old := swap_u32(&x, 777)
36 assert old == 777
37 assert x == 777
38}
39
40fn test_store_u32_basic() {
41 mut x := u32(1)
42 store_u32(&x, 555)
43 assert x == 555
44}
45
46fn test_load_u32_basic() {
47 mut x := u32(888)
48 assert load_u32(&x) == 888
49}
50
51fn test_cas_u32_basic() {
52 mut x := u32(10)
53 assert cas_u32(&x, 10, 50)
54 assert x == 50
55}
56
57fn test_cas_u32_fail() {
58 mut x := u32(10)
59 assert !cas_u32(&x, 5, 999)
60 assert x == 10
61}
62
63fn test_cas_u32_nochange_on_fail() {
64 mut x := u32(777)
65 cas_u32(&x, 5, 9)
66 assert x == 777
67}
68
69fn test_cas_u32_boundary() {
70 mut x := u32(0xffffffff)
71 assert cas_u32(&x, 0xffffffff, 0)
72 assert x == 0
73}
74
75fn test_add_u32_concurrent() {
76 mut x := u32(0)
77 mut threads := []thread{}
78
79 for _ in 0 .. 8 {
80 threads << spawn fn (px &u32) {
81 for _ in 0 .. 100_000 {
82 add_u32(px, 1)
83 }
84 }(&x)
85 }
86
87 for t in threads {
88 t.wait()
89 }
90
91 assert x == 800_000
92}
93
94fn test_swap_u32_concurrent() {
95 mut x := u32(0)
96 mut threads := []thread{}
97
98 for _ in 0 .. 8 {
99 threads << spawn fn (px &u32) {
100 for _ in 0 .. 50_000 {
101 swap_u32(px, 123)
102 }
103 }(&x)
104 }
105
106 for t in threads {
107 t.wait()
108 }
109
110 assert x == 123
111}
112
113fn test_cas_u32_concurrent_inc() {
114 mut x := u32(0)
115 mut threads := []thread{}
116
117 for _ in 0 .. 8 {
118 threads << spawn fn (px &u32) {
119 for _ in 0 .. 50_000 {
120 for {
121 old := load_u32(px)
122 if cas_u32(px, old, old + 1) {
123 break
124 }
125 }
126 }
127 }(&x)
128 }
129
130 for t in threads {
131 t.wait()
132 }
133
134 assert x == 400_000
135}
136
137fn test_cas_u32_contended_flip() {
138 mut x := u32(0)
139 mut threads := []thread{}
140
141 for _ in 0 .. 4 {
142 threads << spawn fn (px &u32) {
143 for _ in 0 .. 200_000 {
144 cas_u32(px, 0, 1)
145 cas_u32(px, 1, 0)
146 }
147 }(&x)
148 }
149
150 for t in threads {
151 t.wait()
152 }
153
154 assert x == 0 || x == 1
155}
156
157fn test_load_store_u32_concurrent() {
158 mut x := u32(0)
159 mut threads := []thread{}
160
161 for i in 0 .. 8 {
162 threads << spawn fn (px &u32, id int) {
163 for _ in 0 .. 50_000 {
164 if id % 2 == 0 {
165 store_u32(px, 1)
166 } else {
167 _ = load_u32(px)
168 }
169 }
170 }(&x, i)
171 }
172
173 for t in threads {
174 t.wait()
175 }
176
177 assert x == 1
178}
179
180fn test_and_u32_concurrent() {
181 mut x := u32(0xffffffff)
182 mut threads := []thread{}
183 for _ in 0 .. 8 {
184 threads << spawn fn (px &u32) {
185 for _ in 0 .. 100_000 {
186 and_u32(px, 0x0f0f0f0f)
187 }
188 }(&x)
189 }
190 for t in threads {
191 t.wait()
192 }
193 assert x == 0x0f0f0f0f
194}
195
196fn test_or_u32_concurrent() {
197 mut x := u32(0)
198 mut threads := []thread{}
199 for _ in 0 .. 8 {
200 threads << spawn fn (px &u32) {
201 for _ in 0 .. 100_000 {
202 or_u32(px, 0xdeadbeef)
203 }
204 }(&x)
205 }
206 for t in threads {
207 t.wait()
208 }
209 assert x == u32(0xdeadbeef)
210}
211