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 |