overhaul rwlocks to address several issues
[musl] / src / thread / pthread_rwlock_tryrdlock.c
index f860ec7..fa271fc 100644 (file)
@@ -2,12 +2,12 @@
 
 int pthread_rwlock_tryrdlock(pthread_rwlock_t *rw)
 {
-       a_inc(&rw->_rw_readers);
-       if (rw->_rw_wrlock) {
-               a_dec(&rw->_rw_readers);
-               if (rw->_rw_waiters && !rw->_rw_readers)
-                       __wake(&rw->_rw_readers, 1, 0);
-               return EBUSY;
-       }
+       int val, cnt;
+       do {
+               val = rw->_rw_lock;
+               cnt = val & 0x7fffffff;
+               if (cnt == 0x7fffffff) return EBUSY;
+               if (cnt == 0x7ffffffe) return EAGAIN;
+       } while (a_cas(&rw->_rw_lock, val, val+1) != val);
        return 0;
 }