diff options
Diffstat (limited to 'src/thread/pthread_mutex_timedlock.c')
-rw-r--r-- | src/thread/pthread_mutex_timedlock.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/src/thread/pthread_mutex_timedlock.c b/src/thread/pthread_mutex_timedlock.c index 7b1afc02..849febb7 100644 --- a/src/thread/pthread_mutex_timedlock.c +++ b/src/thread/pthread_mutex_timedlock.c @@ -2,11 +2,12 @@ int pthread_mutex_timedlock(pthread_mutex_t *restrict m, const struct timespec *restrict at) { - int r, t; - - if (m->_m_type == PTHREAD_MUTEX_NORMAL && !a_cas(&m->_m_lock, 0, EBUSY)) + if ((m->_m_type&15) == PTHREAD_MUTEX_NORMAL + && !a_cas(&m->_m_lock, 0, EBUSY)) return 0; + int r, t, priv = (m->_m_type & 128) ^ 128; + while ((r=pthread_mutex_trylock(m)) == EBUSY) { if (!(r=m->_m_lock) || (r&0x40000000)) continue; if ((m->_m_type&3) == PTHREAD_MUTEX_ERRORCHECK @@ -16,7 +17,7 @@ int pthread_mutex_timedlock(pthread_mutex_t *restrict m, const struct timespec * a_inc(&m->_m_waiters); t = r | 0x80000000; a_cas(&m->_m_lock, r, t); - r = __timedwait(&m->_m_lock, t, CLOCK_REALTIME, at, 0, 0, 0); + r = __timedwait(&m->_m_lock, t, CLOCK_REALTIME, at, 0, 0, priv); a_dec(&m->_m_waiters); if (r && r != EINTR) break; } |