diff options
author | ylavic <ylavic@13f79535-47bb-0310-9956-ffa450edef68> | 2017-05-07 21:35:30 +0000 |
---|---|---|
committer | ylavic <ylavic@13f79535-47bb-0310-9956-ffa450edef68> | 2017-05-07 21:35:30 +0000 |
commit | 2a38adcde87a3fe074e5e998cb2e658d5084ce81 (patch) | |
tree | 278e91fb321da52936150a853c31c111aec4d7bb /locks/netware | |
parent | c67f389a1051f39afde0f194bf0d49e430f7c6fc (diff) | |
download | libapr-2a38adcde87a3fe074e5e998cb2e658d5084ce81.tar.gz |
locks: thread: timedlock: better handling of spurious wakeups that may be
inherent to some native/OS condvar implementation.
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@1794266 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'locks/netware')
-rw-r--r-- | locks/netware/thread_mutex.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/locks/netware/thread_mutex.c b/locks/netware/thread_mutex.c index 9c2164278..435abebba 100644 --- a/locks/netware/thread_mutex.c +++ b/locks/netware/thread_mutex.c @@ -115,7 +115,8 @@ APR_DECLARE(apr_status_t) apr_thread_mutex_timedlock(apr_thread_mutex_t *mutex, apr_interval_time_t timeout) { if (mutex->cond) { - apr_status_t rv; + apr_status_t rv = APR_SUCCESS; + NXLock(mutex->mutex); if (mutex->locked) { if (timeout <= 0) { @@ -123,13 +124,15 @@ APR_DECLARE(apr_status_t) apr_thread_mutex_timedlock(apr_thread_mutex_t *mutex, } else { mutex->num_waiters++; - rv = apr_thread_cond_timedwait(mutex->cond, mutex, timeout); + do { + rv = apr_thread_cond_timedwait(mutex->cond, mutex, + timeout); + } while (rv == APR_SUCCESS && mutex->locked); mutex->num_waiters--; } } - else { + if (rv == APR_SUCCESS) { mutex->locked = 1; - rv = APR_SUCCESS; } NXUnlock(mutex->mutex); return rv; @@ -140,25 +143,24 @@ APR_DECLARE(apr_status_t) apr_thread_mutex_timedlock(apr_thread_mutex_t *mutex, APR_DECLARE(apr_status_t) apr_thread_mutex_unlock(apr_thread_mutex_t *mutex) { + apr_status_t rv = APR_SUCCESS; + if (mutex->cond) { - apr_status_t rv; NXLock(mutex->mutex); + if (!mutex->locked) { rv = APR_EINVAL; } else if (mutex->num_waiters) { rv = apr_thread_cond_signal(mutex->cond); } - else { + if (rv == APR_SUCCESS) { mutex->locked = 0; - rv = APR_SUCCESS; } - NXUnlock(mutex->mutex); - return rv; } NXUnlock(mutex->mutex); - return APR_SUCCESS; + return rv; } APR_DECLARE(apr_status_t) apr_thread_mutex_destroy(apr_thread_mutex_t *mutex) |