|
7 | 7 | #include <ztest.h> |
8 | 8 | #include <sys/atomic.h> |
9 | 9 |
|
| 10 | +/* convenience macro - return either 64-bit or 32-bit value */ |
| 11 | +#define ATOMIC_WORD(val_if_64, val_if_32) \ |
| 12 | + ((atomic_t)((sizeof(void *) == sizeof(uint64_t)) ? (val_if_64) : (val_if_32))) |
| 13 | + |
10 | 14 | /* an example of the number of atomic bit in an array */ |
11 | 15 | #define NUM_FLAG_BITS 100 |
12 | 16 |
|
@@ -102,6 +106,9 @@ void test_atomic(void) |
102 | 106 |
|
103 | 107 | ATOMIC_DEFINE(flag_bits, NUM_FLAG_BITS) = {0}; |
104 | 108 |
|
| 109 | + zassert_equal(sizeof(atomic_t), ATOMIC_WORD(sizeof(uint64_t), sizeof(uint32_t)), |
| 110 | + "sizeof(atomic_t)"); |
| 111 | + |
105 | 112 | target = 4; |
106 | 113 | value = 5; |
107 | 114 | oldvalue = 6; |
@@ -211,63 +218,63 @@ void test_atomic(void) |
211 | 218 | target = 0xFF00; |
212 | 219 | value = 0x0F0F; |
213 | 220 | zassert_true((atomic_nand(&target, value) == 0xFF00), "atomic_nand"); |
214 | | - zassert_true((target == 0xFFFFF0FF), "atomic_nand"); |
| 221 | + zassert_true((target == ATOMIC_WORD(0xFFFFFFFFFFFFF0FF, 0xFFFFF0FF)), "atomic_nand"); |
215 | 222 |
|
216 | 223 | /* atomic_test_bit() */ |
217 | | - for (i = 0; i < 32; i++) { |
218 | | - target = 0x0F0F0F0F; |
219 | | - zassert_true(!!(atomic_test_bit(&target, i) == !!(target & (1 << i))), |
| 224 | + for (i = 0; i < ATOMIC_BITS; i++) { |
| 225 | + target = ATOMIC_WORD(0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F); |
| 226 | + zassert_true(!!(atomic_test_bit(&target, i) == !!(target & BIT(i))), |
220 | 227 | "atomic_test_bit"); |
221 | 228 | } |
222 | 229 |
|
223 | 230 | /* atomic_test_and_clear_bit() */ |
224 | | - for (i = 0; i < 32; i++) { |
225 | | - orig = 0x0F0F0F0F; |
| 231 | + for (i = 0; i < ATOMIC_BITS; i++) { |
| 232 | + orig = ATOMIC_WORD(0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F); |
226 | 233 | target = orig; |
227 | | - zassert_true(!!(atomic_test_and_clear_bit(&target, i)) == !!(orig & (1 << i)), |
| 234 | + zassert_true(!!(atomic_test_and_clear_bit(&target, i)) == !!(orig & BIT(i)), |
228 | 235 | "atomic_test_and_clear_bit"); |
229 | | - zassert_true(target == (orig & ~(1 << i)), "atomic_test_and_clear_bit"); |
| 236 | + zassert_true(target == (orig & ~BIT(i)), "atomic_test_and_clear_bit"); |
230 | 237 | } |
231 | 238 |
|
232 | 239 | /* atomic_test_and_set_bit() */ |
233 | | - for (i = 0; i < 32; i++) { |
234 | | - orig = 0x0F0F0F0F; |
| 240 | + for (i = 0; i < ATOMIC_BITS; i++) { |
| 241 | + orig = ATOMIC_WORD(0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F); |
235 | 242 | target = orig; |
236 | | - zassert_true(!!(atomic_test_and_set_bit(&target, i)) == !!(orig & (1 << i)), |
| 243 | + zassert_true(!!(atomic_test_and_set_bit(&target, i)) == !!(orig & BIT(i)), |
237 | 244 | "atomic_test_and_set_bit"); |
238 | | - zassert_true(target == (orig | (1 << i)), "atomic_test_and_set_bit"); |
| 245 | + zassert_true(target == (orig | BIT(i)), "atomic_test_and_set_bit"); |
239 | 246 | } |
240 | 247 |
|
241 | 248 | /* atomic_clear_bit() */ |
242 | | - for (i = 0; i < 32; i++) { |
243 | | - orig = 0x0F0F0F0F; |
| 249 | + for (i = 0; i < ATOMIC_BITS; i++) { |
| 250 | + orig = ATOMIC_WORD(0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F); |
244 | 251 | target = orig; |
245 | 252 | atomic_clear_bit(&target, i); |
246 | | - zassert_true(target == (orig & ~(1 << i)), "atomic_clear_bit"); |
| 253 | + zassert_true(target == (orig & ~BIT(i)), "atomic_clear_bit"); |
247 | 254 | } |
248 | 255 |
|
249 | 256 | /* atomic_set_bit() */ |
250 | | - for (i = 0; i < 32; i++) { |
251 | | - orig = 0x0F0F0F0F; |
| 257 | + for (i = 0; i < ATOMIC_BITS; i++) { |
| 258 | + orig = ATOMIC_WORD(0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F); |
252 | 259 | target = orig; |
253 | 260 | atomic_set_bit(&target, i); |
254 | | - zassert_true(target == (orig | (1 << i)), "atomic_set_bit"); |
| 261 | + zassert_true(target == (orig | BIT(i)), "atomic_set_bit"); |
255 | 262 | } |
256 | 263 |
|
257 | 264 | /* atomic_set_bit_to(&target, i, false) */ |
258 | | - for (i = 0; i < 32; i++) { |
259 | | - orig = 0x0F0F0F0F; |
| 265 | + for (i = 0; i < ATOMIC_BITS; i++) { |
| 266 | + orig = ATOMIC_WORD(0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F); |
260 | 267 | target = orig; |
261 | 268 | atomic_set_bit_to(&target, i, false); |
262 | | - zassert_true(target == (orig & ~(1 << i)), "atomic_set_bit_to"); |
| 269 | + zassert_true(target == (orig & ~BIT(i)), "atomic_set_bit_to"); |
263 | 270 | } |
264 | 271 |
|
265 | 272 | /* atomic_set_bit_to(&target, i, true) */ |
266 | | - for (i = 0; i < 32; i++) { |
267 | | - orig = 0x0F0F0F0F; |
| 273 | + for (i = 0; i < ATOMIC_BITS; i++) { |
| 274 | + orig = ATOMIC_WORD(0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F); |
268 | 275 | target = orig; |
269 | 276 | atomic_set_bit_to(&target, i, true); |
270 | | - zassert_true(target == (orig | (1 << i)), "atomic_set_bit_to"); |
| 277 | + zassert_true(target == (orig | BIT(i)), "atomic_set_bit_to"); |
271 | 278 | } |
272 | 279 |
|
273 | 280 | /* ATOMIC_DEFINE */ |
|
0 commit comments