X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=test%2Flinuxrwlocks.c;h=ac2fe521a36f77bcc7eb523d2c0254d1396f6b6a;hb=616746ec12aae78b0d0262c009568109686cb000;hp=dcf323caed1383d0c973a2801b52e00517b0d21b;hpb=50b95c3747f4fe79b2ab1a1a6fc303224e16e418;p=model-checker.git diff --git a/test/linuxrwlocks.c b/test/linuxrwlocks.c index dcf323c..ac2fe52 100644 --- a/test/linuxrwlocks.c +++ b/test/linuxrwlocks.c @@ -1,17 +1,15 @@ #include -#include "libthreads.h" +#include #include "librace.h" #include "stdatomic.h" - #define RW_LOCK_BIAS 0x00100000 #define WRITE_LOCK_CMP RW_LOCK_BIAS /** Example implementation of linux rw lock along with 2 thread test * driver... */ - typedef union { atomic_int lock; } rwlock_t; @@ -28,44 +26,44 @@ static inline int write_can_lock(rwlock_t *lock) static inline void read_lock(rwlock_t *rw) { - int priorvalue=atomic_fetch_sub_explicit(&rw->lock, 1, memory_order_acquire); - while (priorvalue<=0) { + int priorvalue = atomic_fetch_sub_explicit(&rw->lock, 1, memory_order_acquire); + while (priorvalue <= 0) { atomic_fetch_add_explicit(&rw->lock, 1, memory_order_relaxed); do { - priorvalue=atomic_load_explicit(&rw->lock, memory_order_relaxed); - } while(priorvalue<=0); - priorvalue=atomic_fetch_sub_explicit(&rw->lock, 1, memory_order_acquire); + priorvalue = atomic_load_explicit(&rw->lock, memory_order_relaxed); + } while (priorvalue <= 0); + priorvalue = atomic_fetch_sub_explicit(&rw->lock, 1, memory_order_acquire); } } static inline void write_lock(rwlock_t *rw) { - int priorvalue=atomic_fetch_sub_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_acquire); - while (priorvalue!=RW_LOCK_BIAS) { + int priorvalue = atomic_fetch_sub_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_acquire); + while (priorvalue != RW_LOCK_BIAS) { atomic_fetch_add_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_relaxed); do { - priorvalue=atomic_load_explicit(&rw->lock, memory_order_relaxed); - } while(priorvalue!=RW_LOCK_BIAS); - priorvalue=atomic_fetch_sub_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_acquire); + priorvalue = atomic_load_explicit(&rw->lock, memory_order_relaxed); + } while (priorvalue != RW_LOCK_BIAS); + priorvalue = atomic_fetch_sub_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_acquire); } } static inline int read_trylock(rwlock_t *rw) { - int priorvalue=atomic_fetch_sub_explicit(&rw->lock, 1, memory_order_acquire); - if (priorvalue>0) + int priorvalue = atomic_fetch_sub_explicit(&rw->lock, 1, memory_order_acquire); + if (priorvalue > 0) return 1; - + atomic_fetch_add_explicit(&rw->lock, 1, memory_order_relaxed); return 0; } static inline int write_trylock(rwlock_t *rw) { - int priorvalue=atomic_fetch_sub_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_acquire); - if (priorvalue==RW_LOCK_BIAS) + int priorvalue = atomic_fetch_sub_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_acquire); + if (priorvalue == RW_LOCK_BIAS) return 1; - + atomic_fetch_add_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_relaxed); return 0; } @@ -86,8 +84,8 @@ int shareddata; static void a(void *obj) { int i; - for(i=0;i<2;i++) { - if ((i%2)==0) { + for(i = 0; i < 2; i++) { + if ((i % 2) == 0) { read_lock(&mylock); load_32(&shareddata); read_unlock(&mylock); @@ -99,14 +97,16 @@ static void a(void *obj) } } -void user_main() +int user_main(int argc, char **argv) { thrd_t t1, t2; atomic_init(&mylock.lock, RW_LOCK_BIAS); thrd_create(&t1, (thrd_start_t)&a, NULL); thrd_create(&t2, (thrd_start_t)&a, NULL); - + thrd_join(t1); thrd_join(t2); + + return 0; }