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