*/
#include <stdio.h>
-#include <assert.h>
#include <urcu/uatomic.h>
+#include "tap.h"
+
+#define NR_TESTS 17
+
struct testvals {
#ifdef UATOMIC_HAS_ATOMIC_BYTE
unsigned char c;
__typeof__(*(ptr)) v; \
\
uatomic_add(ptr, 10); \
- assert(uatomic_read(ptr) == 10); \
- uatomic_add(ptr, -11UL); \
- assert(uatomic_read(ptr) == (__typeof__(*(ptr)))-1UL); \
- v = uatomic_cmpxchg(ptr, -1UL, 22); \
- assert(uatomic_read(ptr) == 22); \
- assert(v == (__typeof__(*(ptr)))-1UL); \
- v = uatomic_cmpxchg(ptr, 33, 44); \
- assert(uatomic_read(ptr) == 22); \
- assert(v == 22); \
- v = uatomic_xchg(ptr, 55); \
- assert(uatomic_read(ptr) == 55); \
- assert(v == 22); \
+ ok1(uatomic_read(ptr) == 10); \
+ \
+ uatomic_add(ptr, -11UL); \
+ ok1(uatomic_read(ptr) == (__typeof__(*(ptr)))-1UL); \
+ \
+ v = uatomic_cmpxchg(ptr, -1UL, 22); \
+ ok1(uatomic_read(ptr) == 22); \
+ ok1(v == (__typeof__(*(ptr)))-1UL); \
+ \
+ v = uatomic_cmpxchg(ptr, 33, 44); \
+ ok1(uatomic_read(ptr) == 22); \
+ ok1(v == 22); \
+ \
+ v = uatomic_xchg(ptr, 55); \
+ ok1(uatomic_read(ptr) == 55); \
+ ok1(v == 22); \
+ \
uatomic_set(ptr, 22); \
uatomic_inc(ptr); \
- assert(uatomic_read(ptr) == 23); \
+ ok1(uatomic_read(ptr) == 23); \
+ \
uatomic_dec(ptr); \
- assert(uatomic_read(ptr) == 22); \
+ ok1(uatomic_read(ptr) == 22); \
+ \
v = uatomic_add_return(ptr, 74); \
- assert(v == 96); \
- assert(uatomic_read(ptr) == 96); \
+ ok1(v == 96); \
+ ok1(uatomic_read(ptr) == 96); \
+ \
uatomic_or(ptr, 58); \
- assert(uatomic_read(ptr) == 122); \
+ ok1(uatomic_read(ptr) == 122); \
+ \
v = uatomic_sub_return(ptr, 1); \
- assert(v == 121); \
+ ok1(v == 121); \
+ \
uatomic_sub(ptr, (unsigned int) 2); \
- assert(uatomic_read(ptr) == 119); \
+ ok1(uatomic_read(ptr) == 119); \
+ \
uatomic_inc(ptr); \
uatomic_inc(ptr); \
- assert(uatomic_read(ptr) == 121); \
+ ok1(uatomic_read(ptr) == 121); \
+ \
uatomic_and(ptr, 129); \
- assert(uatomic_read(ptr) == 1); \
+ ok1(uatomic_read(ptr) == 1); \
+ \
} while (0)
-int main(int argc, char **argv)
+int main(void)
{
+ int nr_run = 2;
+#ifdef UATOMIC_HAS_ATOMIC_BYTE
+ nr_run += 1;
+#endif
+#ifdef UATOMIC_HAS_ATOMIC_SHORT
+ nr_run += 1;
+#endif
+
+ plan_tests(nr_run * NR_TESTS);
#ifdef UATOMIC_HAS_ATOMIC_BYTE
+ diag("Test atomic ops on byte");
do_test(&vals.c);
#endif
#ifdef UATOMIC_HAS_ATOMIC_SHORT
+ diag("Test atomic ops on short");
do_test(&vals.s);
#endif
+ diag("Test atomic ops on int");
do_test(&vals.i);
+ diag("Test atomic ops on long");
do_test(&vals.l);
- printf("Atomic ops test OK\n");
- return 0;
+ return exit_status();
}