X-Git-Url: http://plrg.eecs.uci.edu/git/?p=model-checker.git;a=blobdiff_plain;f=userprog.c;h=33319b1ce873c891b4bce429790196280b3acc12;hp=bab9f982a614c209c37acd84a06f41ffe061b35b;hb=eac9060f22aa904ebbd195c1376346adfdfe7a02;hpb=0d2962592522736fa08c74eb5f5e4847f574eaa6 diff --git a/userprog.c b/userprog.c index bab9f98..33319b1 100644 --- a/userprog.c +++ b/userprog.c @@ -1,23 +1,28 @@ #include +#include #include "libthreads.h" #include "libatomic.h" +#include "librace.h" static void a(atomic_int *obj) { int i; int ret; - for (i = 0; i < 10; i++) { + store_32(&i, 10); + printf("load 32 yields: %d\n", load_32(&i)); + + for (i = 0; i < 2; i++) { printf("Thread %d, loop %d\n", thrd_current(), i); - switch (i % 4) { + switch (i % 2) { case 1: ret = atomic_load(obj); printf("Read value: %d\n", ret); break; - case 3: - atomic_store(obj, i); - printf("Write value: %d\n", i); + case 0: + atomic_store(obj, i + 1); + printf("Write value: %d\n", i + 1); break; } } @@ -26,13 +31,18 @@ static void a(atomic_int *obj) void user_main() { thrd_t t1, t2; - atomic_int obj; + atomic_int *obj; + + obj = malloc(sizeof(*obj)); + + atomic_init(obj, 0); - printf("Creating 2 threads\n"); - thrd_create(&t1, (thrd_start_t)&a, &obj); - thrd_create(&t2, (thrd_start_t)&a, &obj); + printf("Thread %d: creating 2 threads\n", thrd_current()); + thrd_create(&t1, (thrd_start_t)&a, obj); + thrd_create(&t2, (thrd_start_t)&a, obj); thrd_join(t1); thrd_join(t2); - printf("Thread is finished\n"); + free(obj); + printf("Thread %d is finished\n", thrd_current()); }