| OLD | NEW |
| 1 #include "pthread_impl.h" | 1 #include "pthread_impl.h" |
| 2 | 2 |
| 3 int pthread_rwlock_timedwrlock(pthread_rwlock_t *restrict rw, const struct times
pec *restrict at) | 3 int pthread_rwlock_timedwrlock(pthread_rwlock_t* restrict rw, |
| 4 { | 4 const struct timespec* restrict at) { |
| 5 » int r, t; | 5 int r, t; |
| 6 » | |
| 7 » r = pthread_rwlock_trywrlock(rw); | |
| 8 » if (r != EBUSY) return r; | |
| 9 » | |
| 10 » int spins = 100; | |
| 11 » while (spins-- && rw->_rw_lock && !rw->_rw_waiters) a_spin(); | |
| 12 | 6 |
| 13 » while ((r=pthread_rwlock_trywrlock(rw))==EBUSY) { | 7 r = pthread_rwlock_trywrlock(rw); |
| 14 » » if (!(r=rw->_rw_lock)) continue; | 8 if (r != EBUSY) |
| 15 » » t = r | 0x80000000; | 9 return r; |
| 16 » » a_inc(&rw->_rw_waiters); | 10 |
| 17 » » a_cas(&rw->_rw_lock, r, t); | 11 int spins = 100; |
| 18 » » r = __timedwait(&rw->_rw_lock, t, CLOCK_REALTIME, at, rw->_rw_sh
ared^128); | 12 while (spins-- && rw->_rw_lock && !rw->_rw_waiters) |
| 19 » » a_dec(&rw->_rw_waiters); | 13 a_spin(); |
| 20 » » if (r && r != EINTR) return r; | 14 |
| 21 » } | 15 while ((r = pthread_rwlock_trywrlock(rw)) == EBUSY) { |
| 22 » return r; | 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; |
| 23 } | 27 } |
| OLD | NEW |