trap UB from attempts to join a detached thread
[musl] / src / thread / pthread_rwlock_timedrdlock.c
index 884b7a1..0d5d0d6 100644 (file)
@@ -8,14 +8,14 @@ int pthread_rwlock_timedrdlock(pthread_rwlock_t *restrict rw, const struct times
        if (r != EBUSY) return r;
        
        int spins = 100;
-       while (spins-- && rw->_rw_lock) a_spin();
+       while (spins-- && rw->_rw_lock && !rw->_rw_waiters) a_spin();
 
        while ((r=pthread_rwlock_tryrdlock(rw))==EBUSY) {
                if (!(r=rw->_rw_lock) || (r&0x7fffffff)!=0x7fffffff) continue;
                t = r | 0x80000000;
                a_inc(&rw->_rw_waiters);
                a_cas(&rw->_rw_lock, r, t);
-               r = __timedwait(&rw->_rw_lock, t, CLOCK_REALTIME, at, 0, 0, rw->_rw_shared^128);
+               r = __timedwait(&rw->_rw_lock, t, CLOCK_REALTIME, at, rw->_rw_shared^128);
                a_dec(&rw->_rw_waiters);
                if (r && r != EINTR) return r;
        }