edits
[cdsspec-compiler.git] / benchmark / linuxrwlocks / linuxrwlocks.c
index b97c45b4b71835f6f74503788487761de78c8b66..1f7059f828004926926c0b0682b52cf909804c9d 100644 (file)
@@ -61,16 +61,34 @@ typedef union {
        @Happens_before:
                # Since commit_point_set has no ID attached, A -> B means that for any B,
                # the previous A happens before B.
-               Read_Unlock -> Read_Lock
+               #Read_Unlock -> Read_Lock
                Read_Unlock -> Write_Lock
                Read_Unlock -> Write_Trylock(HB_Write_Trylock_Succ)
-               Read_Unlock -> Read_Trylock(HB_Read_Trylock_Succ)
+               #Read_Unlock -> Read_Trylock(HB_Read_Trylock_Succ)
 
                Write_Unlock -> Write_Lock
                Write_Unlock -> Write_Trylock(HB_Write_Trylock_Succ)
 
                Write_Unlock -> Read_Lock
                Write_Unlock -> Read_Trylock(HB_Read_Trylock_Succ)
+       
+       @Commutativity: Read_Lock <-> Read_Lock: true
+       @Commutativity: Read_Lock <-> Read_Unlock: true
+       @Commutativity: Read_Lock <-> Read_Trylock: true
+       @Commutativity: Read_Lock <-> Write_Trylock: !_Method2.__RET__
+       
+       @Commutativity: Read_Unlock <-> Read_Unlock: true
+       @Commutativity: Read_Unlock <-> Read_Trylock: true
+       @Commutativity: Read_Unlock <-> Write_Trylock: !_Method2.__RET__
+
+       @Commutativity: Read_Trylock <-> Read_Trylock: true
+       @Commutativity: Read_Trylock <-> Write_Trylock: !_Method1.__RET__ || !_Method2.__RET__
+       @Commutativity: Read_Trylock <-> Write_Lock: !_Method1.__RET__
+       @Commutativity: Read_Trylock <-> Write_Unlock: !_Method1.__RET__
+
+       @Commutativity: Write_Trylock <-> Write_Trylock: !_Method1.__RET__ || !_Method2.__RET__
+       @Commutativity: Write_Trylock <-> Write_Unlock: !_Method1.__RET__
+       @Commutativity: Write_Trylock <-> Write_Lock: !_Method1.__RET__
        @End
 */
 
@@ -95,6 +113,8 @@ static inline int write_can_lock(rwlock_t *lock)
 */
 static inline void read_lock(rwlock_t *rw)
 {
+       
+       /**********  Admissibility  **********/
        int priorvalue = atomic_fetch_sub_explicit(&rw->lock, 1, memory_order_acquire);
        /**
                @Begin
@@ -107,6 +127,7 @@ static inline void read_lock(rwlock_t *rw)
                while (atomic_load_explicit(&rw->lock, memory_order_relaxed) <= 0) {
                        thrd_yield();
                }
+               /**********  Admissibility  **********/
                priorvalue = atomic_fetch_sub_explicit(&rw->lock, 1, memory_order_acquire);
                /**
                        @Begin
@@ -128,6 +149,7 @@ static inline void read_lock(rwlock_t *rw)
 */
 static inline void write_lock(rwlock_t *rw)
 {
+       /**********  Admissibility  **********/
        int priorvalue = atomic_fetch_sub_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_acquire);
        /**
                @Begin
@@ -140,6 +162,7 @@ static inline void write_lock(rwlock_t *rw)
                while (atomic_load_explicit(&rw->lock, memory_order_relaxed) != RW_LOCK_BIAS) {
                        thrd_yield();
                }
+               /**********  Admissibility  **********/
                priorvalue = atomic_fetch_sub_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_acquire);
                /**
                        @Begin
@@ -157,13 +180,14 @@ static inline void write_lock(rwlock_t *rw)
        //@Condition: writer_lock_acquired == false
        @HB_condition: HB_Read_Trylock_Succ :: __RET__ == 1
        @Action:
-               if (__COND_SAT__)
+               if (__RET__)
                        reader_lock_cnt++;
-       @Post_check: __COND_SAT__ ? __RET__ == 1 : __RET__ == 0
+       @Post_check: __RET__ == !writer_lock_acquired || !__RET__
        @End
 */
 static inline int read_trylock(rwlock_t *rw)
 {
+       /**********  Admissibility  **********/
        int priorvalue = atomic_fetch_sub_explicit(&rw->lock, 1, memory_order_acquire);
        /**
                @Begin
@@ -204,6 +228,7 @@ static inline int read_trylock(rwlock_t *rw)
 */
 static inline int write_trylock(rwlock_t *rw)
 {
+       /**********  Admissibility  **********/
        int priorvalue = atomic_fetch_sub_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_acquire);
        //model_print("write_trylock: priorvalue: %d\n", priorvalue);
        /**
@@ -243,6 +268,7 @@ static inline int write_trylock(rwlock_t *rw)
 */
 static inline void read_unlock(rwlock_t *rw)
 {
+       /**********  Admissibility  **********/
        atomic_fetch_add_explicit(&rw->lock, 1, memory_order_release);
        /**
                @Begin
@@ -262,6 +288,7 @@ static inline void read_unlock(rwlock_t *rw)
 */
 static inline void write_unlock(rwlock_t *rw)
 {
+       /**********  Admissibility  **********/
        atomic_fetch_add_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_release);
        /**
                @Begin
@@ -283,37 +310,27 @@ int shareddata;
 
 static void a(void *obj)
 {
-       int i;
-       for(i = 0; i < 2; i++) {
-               if ((i % 2) == 0) {
-                       read_lock(&mylock);
-                       //load_32(&shareddata);
-                       //printf("%d\n", shareddata);
-                       read_unlock(&mylock);
-               } else {
-                       write_lock(&mylock);
-                       //store_32(&shareddata,(unsigned int)i);
-                       shareddata = 47;
-                       write_unlock(&mylock);
-               }
-       }
+       read_lock(&mylock);
+       //load_32(&shareddata);
+       //printf("%d\n", shareddata);
+       read_unlock(&mylock);
+       
+       write_lock(&mylock);
+       //store_32(&shareddata,(unsigned int)i);
+       shareddata = 47;
+       write_unlock(&mylock);
 }
 
 static void b(void *obj)
 {
-       int i;
-       for(i = 0; i < 2; i++) {
-               if ((i % 2) == 0) {
-                       if (read_trylock(&mylock) == 1) {
-                               //printf("%d\n", shareddata);
-                               read_unlock(&mylock);
-                       }
-               } else {
-                       if (write_trylock(&mylock) == 1) {
-                               //shareddata = 47;
-                               write_unlock(&mylock);
-                       }
-               }
+       if (read_trylock(&mylock) == 1) {
+               //printf("%d\n", shareddata);
+               read_unlock(&mylock);
+       }
+       
+       if (write_trylock(&mylock) == 1) {
+               //shareddata = 47;
+               write_unlock(&mylock);
        }
 }