v2 / vlib / x / atomics / u64_test.v
187 lines · 157 sloc · 2.82 KB · 1c4bb916e5cdf6aecbc6c6315f95453a9e8778f3
Raw
1// vtest build: !(macos || windows)
2
3module atomics
4
5fn test_load_u64_basic() {
6 mut x := u64(1234567890123)
7 assert load_u64(&x) == 1234567890123
8}
9
10fn test_store_u64_basic() {
11 mut x := u64(1)
12 store_u64(&x, 999999)
13 assert x == 999999
14}
15
16fn test_swap_u64_basic() {
17 mut x := u64(123)
18 old := swap_u64(&x, 999)
19 assert old == 123
20 assert x == 999
21}
22
23fn test_swap_u64_same() {
24 mut x := u64(777777)
25 old := swap_u64(&x, 777777)
26 assert old == 777777
27 assert x == 777777
28}
29
30fn test_add_u64_basic() {
31 mut x := u64(0)
32 for _ in 0 .. 1000 {
33 add_u64(&x, 2)
34 }
35 assert x == 2000
36}
37
38fn test_add_u64_wraparound() {
39 mut x := u64(0xffffffffffffffff)
40 add_u64(&x, 1)
41 assert x == 0
42}
43
44fn test_add_u64_return() {
45 mut x := u64(10)
46 r := add_u64(&x, 100)
47 assert r == 110
48 assert x == 110
49}
50
51fn test_cas_u64_basic() {
52 mut x := u64(111)
53 assert cas_u64(&x, 111, 222)
54 assert x == 222
55}
56
57fn test_cas_u64_fail() {
58 mut x := u64(500)
59 assert !cas_u64(&x, 100, 200)
60 assert x == 500
61}
62
63fn test_cas_u64_nochange_fail() {
64 mut x := u64(999)
65 cas_u64(&x, 1, 2)
66 assert x == 999
67}
68
69fn test_cas_u64_boundary() {
70 mut x := u64(0xffffffffffffffff)
71 assert cas_u64(&x, 0xffffffffffffffff, 0)
72 assert x == 0
73}
74
75fn test_add_u64_concurrent() {
76 mut x := u64(0)
77 mut threads := []thread{}
78
79 for _ in 0 .. 8 {
80 threads << spawn fn (px &u64) {
81 for _ in 0 .. 100_000 {
82 add_u64(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_u64_concurrent() {
95 mut x := u64(0)
96 mut threads := []thread{}
97
98 for _ in 0 .. 8 {
99 threads << spawn fn (px &u64) {
100 for _ in 0 .. 50_000 {
101 swap_u64(px, 123456)
102 }
103 }(&x)
104 }
105
106 for t in threads {
107 t.wait()
108 }
109
110 assert x == 123456
111}
112
113fn test_cas_u64_concurrent_inc() {
114 mut x := u64(0)
115 mut threads := []thread{}
116
117 for _ in 0 .. 8 {
118 threads << spawn fn (px &u64) {
119 for _ in 0 .. 50_000 {
120 for {
121 old := load_u64(px)
122 if cas_u64(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_u64_contended_flip() {
138 mut x := u64(0)
139 mut threads := []thread{}
140
141 for _ in 0 .. 4 {
142 threads << spawn fn (px &u64) {
143 for _ in 0 .. 200_000 {
144 cas_u64(px, 0, 1)
145 cas_u64(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_and_u64_concurrent() {
158 mut x := u64(0xffffffffffffffff)
159 mut threads := []thread{}
160 for _ in 0 .. 8 {
161 threads << spawn fn (px &u64) {
162 for _ in 0 .. 100_000 {
163 and_u64(px, 0x00ff00ff00ff00ff)
164 }
165 }(&x)
166 }
167 for t in threads {
168 t.wait()
169 }
170 assert x == 0x00ff00ff00ff00ff
171}
172
173fn test_or_u64_concurrent() {
174 mut x := u64(0)
175 mut threads := []thread{}
176 for _ in 0 .. 8 {
177 threads << spawn fn (px &u64) {
178 for _ in 0 .. 100_000 {
179 or_u64(px, 0xfedcba9876543210)
180 }
181 }(&x)
182 }
183 for t in threads {
184 t.wait()
185 }
186 assert x == u64(0xfedcba9876543210)
187}
188