blob: cf4d432f02f5b6d03e9214f1557e651b2b2a932c [file] [log] [blame]
Viet-Trung Luu96b05c12016-01-11 11:26:36 -08001#include "pthread_impl.h"
2
George Kulakowski17e3b042016-02-18 15:59:50 -08003int pthread_rwlock_timedwrlock(pthread_rwlock_t* restrict rw,
4 const struct timespec* restrict at) {
5 int r, t;
Viet-Trung Luu96b05c12016-01-11 11:26:36 -08006
George Kulakowski17e3b042016-02-18 15:59:50 -08007 r = pthread_rwlock_trywrlock(rw);
8 if (r != EBUSY)
9 return r;
10
11 int spins = 100;
12 while (spins-- && rw->_rw_lock && !rw->_rw_waiters)
13 a_spin();
14
15 while ((r = pthread_rwlock_trywrlock(rw)) == EBUSY) {
16 if (!(r = rw->_rw_lock))
17 continue;
18 t = r | 0x80000000;
19 a_inc(&rw->_rw_waiters);
20 a_cas(&rw->_rw_lock, r, t);
21 r = __timedwait(&rw->_rw_lock, t, CLOCK_REALTIME, at, rw->_rw_shared ^ 128);
22 a_dec(&rw->_rw_waiters);
23 if (r && r != EINTR)
24 return r;
25 }
26 return r;
Viet-Trung Luu96b05c12016-01-11 11:26:36 -080027}