X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=tests%2Ftest_uatomic.c;fp=tests%2Ftest_uatomic.c;h=6c11a2dfe6271d423fd918da26633f9891119e5d;hp=0000000000000000000000000000000000000000;hb=ec4e58a3aba2084440012f8ccac3a31eb6101183;hpb=2f873279bc92fac32e6549d6eb72f3197c7048ac diff --git a/tests/test_uatomic.c b/tests/test_uatomic.c new file mode 100644 index 0000000..6c11a2d --- /dev/null +++ b/tests/test_uatomic.c @@ -0,0 +1,66 @@ +#include +#include +#include + +#if (defined(__i386__) || defined(__x86_64__)) +#define HAS_ATOMIC_BYTE +#define HAS_ATOMIC_SHORT +#endif + +struct testvals { +#ifdef HAS_ATOMIC_BYTE + unsigned char c; +#endif +#ifdef HAS_ATOMIC_SHORT + unsigned short s; +#endif + unsigned int i; + unsigned long l; +}; + +static struct testvals vals; + +#define do_test(ptr) \ +do { \ + __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); \ + uatomic_set(ptr, 22); \ + uatomic_inc(ptr); \ + assert(uatomic_read(ptr) == 23); \ + uatomic_dec(ptr); \ + assert(uatomic_read(ptr) == 22); \ + v = uatomic_add_return(ptr, 100); \ + assert(v == 122); \ + assert(uatomic_read(ptr) == 122); \ + v = uatomic_sub_return(ptr, 1); \ + assert(v == 121); \ + assert(uatomic_read(ptr) == 121); \ +} while (0) + +int main(int argc, char **argv) +{ +#ifdef HAS_ATOMIC_BYTE + do_test(&vals.c); +#endif +#ifdef HAS_ATOMIC_SHORT + do_test(&vals.s); +#endif + do_test(&vals.i); + do_test(&vals.l); + printf("Atomic ops test OK\n"); + + return 0; +}