projects
/
musl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
getservbyport_r: fix out-of-bounds buffer read
[musl]
/
src
/
thread
/
pthread_rwlock_timedwrlock.c
diff --git
a/src/thread/pthread_rwlock_timedwrlock.c
b/src/thread/pthread_rwlock_timedwrlock.c
index
339a167
..
d77706e
100644
(file)
--- a/
src/thread/pthread_rwlock_timedwrlock.c
+++ b/
src/thread/pthread_rwlock_timedwrlock.c
@@
-1,16
+1,25
@@
#include "pthread_impl.h"
#include "pthread_impl.h"
-int pthread_rwlock_timedwrlock(pthread_rwlock_t *restrict rw, const struct timespec *restrict at)
+int
__
pthread_rwlock_timedwrlock(pthread_rwlock_t *restrict rw, const struct timespec *restrict at)
{
int r, t;
{
int r, t;
- while ((r=pthread_rwlock_trywrlock(rw))==EBUSY) {
+
+ r = pthread_rwlock_trywrlock(rw);
+ if (r != EBUSY) return r;
+
+ int spins = 100;
+ while (spins-- && rw->_rw_lock && !rw->_rw_waiters) a_spin();
+
+ while ((r=__pthread_rwlock_trywrlock(rw))==EBUSY) {
if (!(r=rw->_rw_lock)) continue;
t = r | 0x80000000;
a_inc(&rw->_rw_waiters);
a_cas(&rw->_rw_lock, r, t);
if (!(r=rw->_rw_lock)) 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, 0
);
+ r = __timedwait(&rw->_rw_lock, t, CLOCK_REALTIME, at,
rw->_rw_shared^128
);
a_dec(&rw->_rw_waiters);
if (r && r != EINTR) return r;
}
return r;
}
a_dec(&rw->_rw_waiters);
if (r && r != EINTR) return r;
}
return r;
}
+
+weak_alias(__pthread_rwlock_timedwrlock, pthread_rwlock_timedwrlock);