diff options
Diffstat (limited to 'src/thread')
-rw-r--r-- | src/thread/pthread_cond_timedwait.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/src/thread/pthread_cond_timedwait.c b/src/thread/pthread_cond_timedwait.c index f5f37af..a0cd490 100644 --- a/src/thread/pthread_cond_timedwait.c +++ b/src/thread/pthread_cond_timedwait.c @@ -146,12 +146,17 @@ relock: if (oldstate == WAITING) goto done; + if (!node.next && !(m->_m_type & 8)) + a_inc(&m->_m_waiters); + /* Unlock the barrier that's holding back the next waiter, and * either wake it or requeue it to the mutex. */ if (node.prev) { int val = m->_m_lock; if (val>0) a_cas(&m->_m_lock, val, val|0x80000000); unlock_requeue(&node.prev->barrier, &m->_m_lock, m->_m_type & (8|128)); + } else if (!!(m->_m_type & 8)) { + a_dec(&m->_m_waiters); } /* Since a signal was consumed, cancellation is not permitted. */ |