1 /* Tests for atomic.h macros.
2 Copyright (C) 2003-2015 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4 Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, see
18 <http://www.gnu.org/licenses/>. */
27 #define CHK2(f,a1,a2,rv,new_mem) \
28 retval = f(&mem, a1, a2); \
30 printf("%s(mem, %lu, %lu): retval %lu != expected %lu\n", \
31 #f, a1, a2, retval, rv); \
34 if (mem != new_mem) { \
35 printf("%s(mem, %lu, %lu): mem %lu != expected %lu\n", \
36 #f, a1, a2, mem, new_mem); \
39 #define CHK1(f,a1,rv,new_mem) \
40 retval = f(&mem, a1); \
42 printf("%s(mem, %lu): retval %lu != expected %lu\n", \
43 #f, a1, retval, rv); \
46 if (mem != new_mem) { \
47 printf("%s(mem, %lu): mem %lu != expected %lu\n", \
48 #f, a1, mem, new_mem); \
51 #define CHK0(f,rv,new_mem) \
54 printf("%s(mem): retval %lu != expected %lu\n", \
58 if (mem != new_mem) { \
59 printf("%s(mem): mem %lu != expected %lu\n", \
64 /* Test various atomic.h macros. */
68 atomic_t mem
, expected
, retval
;
71 #ifdef atomic_compare_and_exchange_val_acq
73 CHK2(atomic_compare_and_exchange_val_acq
, 35, 24, 24, 35);
75 CHK2(atomic_compare_and_exchange_val_acq
, 10, 15, 12, 12);
77 CHK2(atomic_compare_and_exchange_val_acq
, -56, -15, -15, -56);
79 CHK2(atomic_compare_and_exchange_val_acq
, 17, 0, -1, -1);
83 CHK2(atomic_compare_and_exchange_bool_acq
, 35, 24, 0, 35);
85 CHK2(atomic_compare_and_exchange_bool_acq
, 10, 15, 1, 12);
87 CHK2(atomic_compare_and_exchange_bool_acq
, -56, -15, 0, -56);
89 CHK2(atomic_compare_and_exchange_bool_acq
, 17, 0, 1, -1);
92 CHK1(atomic_exchange_acq
, 31, 64, 31);
94 CHK1(atomic_exchange_and_add
, 11, 2, 13);
96 CHK1(atomic_exchange_and_add_acq
, 11, 2, 13);
98 CHK1(atomic_exchange_and_add_rel
, 11, 2, 13);
101 atomic_add (&mem
, 22);
104 printf ("atomic_add(mem, 22): mem %lu != expected 1\n", mem
);
109 atomic_increment (&mem
);
112 printf ("atomic_increment(mem): mem %lu != expected 0\n", mem
);
117 if ((retval
= atomic_increment_val (&mem
)) != 3)
119 printf ("atomic_increment_val(mem): retval %lu != expected 3\n", retval
);
124 CHK0(atomic_increment_and_test
, 0, 1);
126 CHK0(atomic_increment_and_test
, 0, 36);
128 CHK0(atomic_increment_and_test
, 1, 0);
130 atomic_decrement (&mem
);
133 printf ("atomic_increment(mem): mem %lu != expected 16\n", mem
);
137 if ((retval
= atomic_decrement_val (&mem
)) != 15)
139 printf ("atomic_decrement_val(mem): retval %lu != expected 15\n", retval
);
144 CHK0(atomic_decrement_and_test
, 0, -1);
147 CHK0(atomic_decrement_and_test
, 0, 14);
149 CHK0(atomic_decrement_and_test
, 1, 0);
151 if (atomic_decrement_if_positive (&mem
) != 1
154 puts ("atomic_decrement_if_positive test 1 failed");
159 if (atomic_decrement_if_positive (&mem
) != 0
162 puts ("atomic_decrement_if_positive test 2 failed");
167 if (atomic_decrement_if_positive (&mem
) != -1
170 puts ("atomic_decrement_if_positive test 3 failed");
175 if (! atomic_add_negative (&mem
, 10)
178 puts ("atomic_add_negative test 1 failed");
183 if (atomic_add_negative (&mem
, 100)
186 puts ("atomic_add_negative test 2 failed");
191 if (atomic_add_negative (&mem
, -10)
194 puts ("atomic_add_negative test 3 failed");
199 if (atomic_add_negative (&mem
, 14)
202 puts ("atomic_add_negative test 4 failed");
207 if (! atomic_add_negative (&mem
, -1)
210 puts ("atomic_add_negative test 5 failed");
215 if (atomic_add_negative (&mem
, 31)
218 puts ("atomic_add_negative test 6 failed");
223 if (atomic_add_zero (&mem
, 31)
226 puts ("atomic_add_zero test 1 failed");
231 if (! atomic_add_zero (&mem
, 36)
234 puts ("atomic_add_zero test 2 failed");
239 if (atomic_add_zero (&mem
, -13)
242 puts ("atomic_add_zero test 3 failed");
247 if (atomic_add_zero (&mem
, 20)
250 puts ("atomic_add_zero test 4 failed");
255 if (atomic_add_zero (&mem
, -20)
258 puts ("atomic_add_zero test 5 failed");
263 if (! atomic_add_zero (&mem
, -10)
266 puts ("atomic_add_zero test 6 failed");
271 atomic_bit_set (&mem
, 1);
274 puts ("atomic_bit_set test 1 failed");
279 atomic_bit_set (&mem
, 3);
282 puts ("atomic_bit_set test 2 failed");
288 atomic_bit_set (&mem
, 35);
289 if (mem
!= 0x800000010LL
)
291 puts ("atomic_bit_set test 3 failed");
297 if (atomic_bit_test_set (&mem
, 1)
300 puts ("atomic_bit_test_set test 1 failed");
305 if (! atomic_bit_test_set (&mem
, 3)
308 puts ("atomic_bit_test_set test 2 failed");
314 if (atomic_bit_test_set (&mem
, 35)
315 || mem
!= 0x800000010LL
)
317 puts ("atomic_bit_test_set test 3 failed");
322 if (! atomic_bit_test_set (&mem
, 32)
323 || mem
!= 0x100000000LL
)
325 puts ("atomic_bit_test_set test 4 failed");
330 #ifdef catomic_compare_and_exchange_val_acq
332 if (catomic_compare_and_exchange_val_acq (&mem
, 35, 24) != 24
335 puts ("catomic_compare_and_exchange_val_acq test 1 failed");
340 if (catomic_compare_and_exchange_val_acq (&mem
, 10, 15) != 12
343 puts ("catomic_compare_and_exchange_val_acq test 2 failed");
348 if (catomic_compare_and_exchange_val_acq (&mem
, -56, -15) != -15
351 puts ("catomic_compare_and_exchange_val_acq test 3 failed");
356 if (catomic_compare_and_exchange_val_acq (&mem
, 17, 0) != -1
359 puts ("catomic_compare_and_exchange_val_acq test 4 failed");
365 if (catomic_compare_and_exchange_bool_acq (&mem
, 35, 24)
368 puts ("catomic_compare_and_exchange_bool_acq test 1 failed");
373 if (! catomic_compare_and_exchange_bool_acq (&mem
, 10, 15)
376 puts ("catomic_compare_and_exchange_bool_acq test 2 failed");
381 if (catomic_compare_and_exchange_bool_acq (&mem
, -56, -15)
384 puts ("catomic_compare_and_exchange_bool_acq test 3 failed");
389 if (! catomic_compare_and_exchange_bool_acq (&mem
, 17, 0)
392 puts ("catomic_compare_and_exchange_bool_acq test 4 failed");
397 if (catomic_exchange_and_add (&mem
, 11) != 2
400 puts ("catomic_exchange_and_add test failed");
405 catomic_add (&mem
, 22);
408 puts ("catomic_add test failed");
413 catomic_increment (&mem
);
416 puts ("catomic_increment test failed");
421 if (catomic_increment_val (&mem
) != 3)
423 puts ("catomic_increment_val test failed");
428 catomic_decrement (&mem
);
431 puts ("catomic_decrement test failed");
435 if (catomic_decrement_val (&mem
) != 15)
437 puts ("catomic_decrement_val test failed");
441 /* Tests for C11-like atomics. */
443 if (atomic_load_relaxed (&mem
) != 11 || atomic_load_acquire (&mem
) != 11)
445 puts ("atomic_load_{relaxed,acquire} test failed");
449 atomic_store_relaxed (&mem
, 12);
452 puts ("atomic_store_relaxed test failed");
455 atomic_store_release (&mem
, 13);
458 puts ("atomic_store_release test failed");
464 if (!atomic_compare_exchange_weak_relaxed (&mem
, &expected
, 25)
465 || mem
!= 25 || expected
!= 14)
467 puts ("atomic_compare_exchange_weak_relaxed test 1 failed");
470 if (atomic_compare_exchange_weak_relaxed (&mem
, &expected
, 14)
471 || mem
!= 25 || expected
!= 25)
473 puts ("atomic_compare_exchange_weak_relaxed test 2 failed");
478 if (!atomic_compare_exchange_weak_acquire (&mem
, &expected
, 25)
479 || mem
!= 25 || expected
!= 14)
481 puts ("atomic_compare_exchange_weak_acquire test 1 failed");
484 if (atomic_compare_exchange_weak_acquire (&mem
, &expected
, 14)
485 || mem
!= 25 || expected
!= 25)
487 puts ("atomic_compare_exchange_weak_acquire test 2 failed");
492 if (!atomic_compare_exchange_weak_release (&mem
, &expected
, 25)
493 || mem
!= 25 || expected
!= 14)
495 puts ("atomic_compare_exchange_weak_release test 1 failed");
498 if (atomic_compare_exchange_weak_release (&mem
, &expected
, 14)
499 || mem
!= 25 || expected
!= 25)
501 puts ("atomic_compare_exchange_weak_release test 2 failed");
506 if (atomic_exchange_acquire (&mem
, 42) != 23 || mem
!= 42)
508 puts ("atomic_exchange_acquire test failed");
512 if (atomic_exchange_release (&mem
, 42) != 23 || mem
!= 42)
514 puts ("atomic_exchange_release test failed");
519 if (atomic_fetch_add_relaxed (&mem
, 1) != 23 || mem
!= 24)
521 puts ("atomic_fetch_add_relaxed test failed");
525 if (atomic_fetch_add_acquire (&mem
, 1) != 23 || mem
!= 24)
527 puts ("atomic_fetch_add_acquire test failed");
531 if (atomic_fetch_add_release (&mem
, 1) != 23 || mem
!= 24)
533 puts ("atomic_fetch_add_release test failed");
537 if (atomic_fetch_add_acq_rel (&mem
, 1) != 23 || mem
!= 24)
539 puts ("atomic_fetch_add_acq_rel test failed");
544 if (atomic_fetch_and_acquire (&mem
, 2) != 3 || mem
!= 2)
546 puts ("atomic_fetch_and_acquire test failed");
551 if (atomic_fetch_or_relaxed (&mem
, 2) != 4 || mem
!= 6)
553 puts ("atomic_fetch_or_relaxed test failed");
557 if (atomic_fetch_or_acquire (&mem
, 2) != 4 || mem
!= 6)
559 puts ("atomic_fetch_or_acquire test failed");
563 /* This is a single-threaded test, so we can't test the effects of the
565 atomic_thread_fence_acquire ();
566 atomic_thread_fence_release ();
567 atomic_thread_fence_seq_cst ();
572 #define TEST_FUNCTION do_test ()
573 #include "../test-skeleton.c"