From 36cb4cb1d9ac17a2eabde158deb033cfdc7993fd Mon Sep 17 00:00:00 2001 From: Brian Norris Date: Thu, 21 Feb 2013 23:18:18 -0800 Subject: [PATCH] test: fences: add simple, semi-useful fence tests Note that due to the quirks discovered in double-read-fv, we don't see all the expected behaviors in the fences2 test. --- test/fences.c | 42 ++++++++++++++++++++++++++++++++++++++++++ test/fences2.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 test/fences.c create mode 100644 test/fences2.c diff --git a/test/fences.c b/test/fences.c new file mode 100644 index 0000000..4d0328f --- /dev/null +++ b/test/fences.c @@ -0,0 +1,42 @@ +#include +#include +#include + +#include "librace.h" + +atomic_int x; +atomic_int y; + +static void a(void *obj) +{ + atomic_store_explicit(&x, 1, memory_order_relaxed); + atomic_store_explicit(&x, 2, memory_order_relaxed); + atomic_thread_fence(memory_order_seq_cst); + printf("Thread A reads: %d\n", atomic_load_explicit(&y, memory_order_relaxed)); +} + +static void b(void *obj) +{ + atomic_store_explicit(&y, 1, memory_order_relaxed); + atomic_store_explicit(&y, 2, memory_order_relaxed); + atomic_thread_fence(memory_order_seq_cst); + printf("Thread B reads: %d\n", atomic_load_explicit(&x, memory_order_relaxed)); +} + +int user_main(int argc, char **argv) +{ + thrd_t t1, t2; + + atomic_init(&x, 0); + atomic_init(&y, 0); + + printf("Main thread: creating 2 threads\n"); + thrd_create(&t1, (thrd_start_t)&a, NULL); + thrd_create(&t2, (thrd_start_t)&b, NULL); + + thrd_join(t1); + thrd_join(t2); + printf("Main thread is finishing\n"); + + return 0; +} diff --git a/test/fences2.c b/test/fences2.c new file mode 100644 index 0000000..2c80d61 --- /dev/null +++ b/test/fences2.c @@ -0,0 +1,46 @@ +#include +#include +#include + +#include "librace.h" +#include "model-assert.h" + +atomic_int x; +atomic_int y; + +static void a(void *obj) +{ + atomic_store_explicit(&x, 1, memory_order_relaxed); + atomic_thread_fence(memory_order_release); + atomic_store_explicit(&x, 2, memory_order_relaxed); +} + +static void b(void *obj) +{ + int r1, r2; + r1 = atomic_load_explicit(&x, memory_order_relaxed); + atomic_thread_fence(memory_order_acquire); + r2 = atomic_load_explicit(&x, memory_order_relaxed); + + printf("FENCES: r1 = %d, r2 = %d\n", r1, r2); + if (r1 == 2) + MODEL_ASSERT(r2 != 1); +} + +int user_main(int argc, char **argv) +{ + thrd_t t1, t2; + + atomic_init(&x, 0); + atomic_init(&y, 0); + + printf("Main thread: creating 2 threads\n"); + thrd_create(&t1, (thrd_start_t)&a, NULL); + thrd_create(&t2, (thrd_start_t)&b, NULL); + + thrd_join(t1); + thrd_join(t2); + printf("Main thread is finishing\n"); + + return 0; +} -- 2.34.1