X-Git-Url: http://demsky.eecs.uci.edu/git/?p=model-checker.git;a=blobdiff_plain;f=test%2Firiw.cc;fp=test%2Firiw.cc;h=fddbf1aa785f93e4bfa7f88185d96e1b7b496d7b;hp=0000000000000000000000000000000000000000;hb=042d2f1a02853db95cbd4bedf52c6b6bbab6b48e;hpb=a65e234b607444355eb6e34097ee55ba93d4c01b diff --git a/test/iriw.cc b/test/iriw.cc new file mode 100644 index 0000000..fddbf1a --- /dev/null +++ b/test/iriw.cc @@ -0,0 +1,66 @@ +/** + * @file iriw.cc + * @brief Independent read and independent write test + */ + +#include +#include +#include + +#include "wildcard.h" +#include "model-assert.h" + +using namespace std; + +atomic_int x, y; +int r1, r2, r3, r4; /* "local" variables */ + +static void a(void *obj) +{ + x.store(1, memory_order_seq_cst); +} + +static void b(void *obj) +{ + y.store(1, memory_order_seq_cst); +} + +static void c(void *obj) +{ + r1 = x.load(memory_order_acquire); + r2 = y.load(memory_order_seq_cst); +} + +static void d(void *obj) +{ + r3 = y.load(memory_order_acquire); + r4 = x.load(memory_order_seq_cst); +} + + +int user_main(int argc, char **argv) +{ + thrd_t t1, t2, t3, t4; + + atomic_init(&x, 0); + atomic_init(&y, 0); + + printf("Main thread: creating 4 threads\n"); + thrd_create(&t1, (thrd_start_t)&a, NULL); + thrd_create(&t2, (thrd_start_t)&b, NULL); + thrd_create(&t3, (thrd_start_t)&c, NULL); + thrd_create(&t4, (thrd_start_t)&d, NULL); + + thrd_join(t1); + thrd_join(t2); + thrd_join(t3); + thrd_join(t4); + printf("Main thread is finished\n"); + + /* + * This condition should not be hit if the execution is SC */ + bool sc = (r1 == 1 && r2 == 0 && r3 == 1 && r4 == 0); + printf("r1 = %d, r2 = %d, r3 = %d and r4 = %d\n", r1, r2, r3, r4); + MODEL_ASSERT(!sc); + return 0; +}