X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=linuxrwlocks%2Flinuxrwlocks.c;h=bf60f16f94da5993ec62d2a9b93f8e8324a95c92;hb=bab731cf43b743adfd95447f5f72200cd22611dd;hp=be3550e11e3c8f8740b4c1a47458180f57994a3a;hpb=9f2a28f12f61001be2bd5adc74964acf5e8e6721;p=model-checker-benchmarks.git diff --git a/linuxrwlocks/linuxrwlocks.c b/linuxrwlocks/linuxrwlocks.c index be3550e..bf60f16 100644 --- a/linuxrwlocks/linuxrwlocks.c +++ b/linuxrwlocks/linuxrwlocks.c @@ -3,80 +3,7 @@ #include #include "librace.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; - -static inline int read_can_lock(rwlock_t *lock) -{ - return atomic_load_explicit(&lock->lock, memory_order_relaxed) > 0; -} - -static inline int write_can_lock(rwlock_t *lock) -{ - return atomic_load_explicit(&lock->lock, memory_order_relaxed) == RW_LOCK_BIAS; -} - -static inline void read_lock(rwlock_t *rw) -{ - 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); - while (atomic_load_explicit(&rw->lock, memory_order_relaxed) <= 0) { - thrd_yield(); - } - 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) { - atomic_fetch_add_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_relaxed); - while (atomic_load_explicit(&rw->lock, memory_order_relaxed) != RW_LOCK_BIAS) { - thrd_yield(); - } - 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) - 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) - return 1; - - atomic_fetch_add_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_relaxed); - return 0; -} - -static inline void read_unlock(rwlock_t *rw) -{ - atomic_fetch_add_explicit(&rw->lock, 1, memory_order_release); -} - -static inline void write_unlock(rwlock_t *rw) -{ - atomic_fetch_add_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_release); -} +#include "linuxrwlocks.h" rwlock_t mylock; int shareddata;