diff options
author | Yann Ylavic <ylavic@apache.org> | 2017-04-07 21:20:46 +0000 |
---|---|---|
committer | Yann Ylavic <ylavic@apache.org> | 2017-04-07 21:20:46 +0000 |
commit | d79bc47ef73b03400921b671c39ad873cdcc15c4 (patch) | |
tree | bfe9a8a296622b438f50166703589fe02c9dfc1f /locks | |
parent | 7df61b199f04cf30e3980b0ad2841a00ce418677 (diff) | |
download | apr-d79bc47ef73b03400921b671c39ad873cdcc15c4.tar.gz |
Merge r1790632 from trunk:
apr_{thread,proc,global}_timedlock() with negative timeout is now equivalent
to apr_{thread,proc,global}_trylock(), i.e. immediate attempt to acquire the
lock (but returning APR_TIMEUP if busy).
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/branches/1.6.x@1790633 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'locks')
-rw-r--r-- | locks/beos/proc_mutex.c | 5 | ||||
-rw-r--r-- | locks/beos/thread_mutex.c | 5 | ||||
-rw-r--r-- | locks/netware/thread_mutex.c | 10 | ||||
-rw-r--r-- | locks/os2/proc_mutex.c | 5 | ||||
-rw-r--r-- | locks/os2/thread_mutex.c | 5 | ||||
-rw-r--r-- | locks/unix/proc_mutex.c | 88 | ||||
-rw-r--r-- | locks/unix/thread_mutex.c | 20 | ||||
-rw-r--r-- | locks/win32/proc_mutex.c | 15 | ||||
-rw-r--r-- | locks/win32/thread_mutex.c | 8 |
9 files changed, 55 insertions, 106 deletions
diff --git a/locks/beos/proc_mutex.c b/locks/beos/proc_mutex.c index e97a2ee80..d253ad5be 100644 --- a/locks/beos/proc_mutex.c +++ b/locks/beos/proc_mutex.c @@ -114,12 +114,9 @@ APR_DECLARE(apr_status_t) apr_proc_mutex_timedlock(apr_proc_mutex_t *mutex, int32 stat; if (atomic_add(&mutex->LockCount, 1) > 0) { - if (!timeout) { + if (timeout <= 0) { stat = B_TIMED_OUT; } - else if (timeout < 0) { - stat = acquire_sem(mutex->Lock); - } else { stat = acquire_sem_etc(mutex->Lock, 1, B_RELATIVE_TIMEOUT, timeout); diff --git a/locks/beos/thread_mutex.c b/locks/beos/thread_mutex.c index f9353509f..e4099d882 100644 --- a/locks/beos/thread_mutex.c +++ b/locks/beos/thread_mutex.c @@ -143,12 +143,9 @@ APR_DECLARE(apr_status_t) apr_thread_mutex_timedlock(apr_thread_mutex_t *mutex, } if (atomic_add(&mutex->LockCount, 1) > 0) { - if (!timeout) { + if (timeout <= 0) { stat = B_TIMED_OUT; } - else if (timeout < 0) { - stat = acquire_sem(mutex->Lock); - } else { stat = acquire_sem_etc(mutex->Lock, 1, B_RELATIVE_TIMEOUT, timeout); diff --git a/locks/netware/thread_mutex.c b/locks/netware/thread_mutex.c index 127610d3e..9c2164278 100644 --- a/locks/netware/thread_mutex.c +++ b/locks/netware/thread_mutex.c @@ -118,18 +118,12 @@ APR_DECLARE(apr_status_t) apr_thread_mutex_timedlock(apr_thread_mutex_t *mutex, apr_status_t rv; NXLock(mutex->mutex); if (mutex->locked) { - if (!timeout) { + if (timeout <= 0) { rv = APR_TIMEUP; } else { mutex->num_waiters++; - if (timeout < 0) { - rv = apr_thread_cond_wait(mutex->cond, mutex); - } - else { - rv = apr_thread_cond_timedwait(mutex->cond, mutex, - timeout); - } + rv = apr_thread_cond_timedwait(mutex->cond, mutex, timeout); mutex->num_waiters--; } } diff --git a/locks/os2/proc_mutex.c b/locks/os2/proc_mutex.c index 564c49cf6..de2e66aeb 100644 --- a/locks/os2/proc_mutex.c +++ b/locks/os2/proc_mutex.c @@ -166,10 +166,7 @@ APR_DECLARE(apr_status_t) apr_proc_mutex_timedlock(apr_proc_mutex_t *mutex, { ULONG rc; - if (timeout < 0) { - rc = DosRequestMutexSem(mutex->hMutex, SEM_INDEFINITE_WAIT); - } - else if (!timeout) { + if (timeout <= 0) { rc = DosRequestMutexSem(mutex->hMutex, SEM_IMMEDIATE_RETURN); } else { diff --git a/locks/os2/thread_mutex.c b/locks/os2/thread_mutex.c index f95ba0fec..fea188d04 100644 --- a/locks/os2/thread_mutex.c +++ b/locks/os2/thread_mutex.c @@ -77,10 +77,7 @@ APR_DECLARE(apr_status_t) apr_thread_mutex_timedlock(apr_thread_mutex_t *mutex, { ULONG rc; - if (timeout < 0) { - rc = DosRequestMutexSem(mutex->hMutex, SEM_INDEFINITE_WAIT); - } - else if (!timeout) { + if (timeout <= 0) { rc = DosRequestMutexSem(mutex->hMutex, SEM_IMMEDIATE_RETURN); } else { diff --git a/locks/unix/proc_mutex.c b/locks/unix/proc_mutex.c index 9d199b30e..3df7df8b8 100644 --- a/locks/unix/proc_mutex.c +++ b/locks/unix/proc_mutex.c @@ -58,32 +58,27 @@ static apr_status_t proc_mutex_no_perms_set(apr_proc_mutex_t *mutex, static apr_status_t proc_mutex_spinsleep_timedacquire(apr_proc_mutex_t *mutex, apr_interval_time_t timeout) { - apr_status_t rv; - if (timeout < 0) { - rv = apr_proc_mutex_lock(mutex); - } - else { #define SLEEP_TIME apr_time_from_msec(10) - for (;;) { - rv = apr_proc_mutex_trylock(mutex); - if (!APR_STATUS_IS_EBUSY(rv)) { - if (rv == APR_SUCCESS) { - mutex->curr_locked = 1; - } - break; - } - if (!timeout) { - rv = APR_TIMEUP; - break; - } - if (timeout > SLEEP_TIME) { - apr_sleep(SLEEP_TIME); - timeout -= SLEEP_TIME; - } - else { - apr_sleep(timeout); - timeout = 0; + apr_status_t rv; + for (;;) { + rv = apr_proc_mutex_trylock(mutex); + if (!APR_STATUS_IS_EBUSY(rv)) { + if (rv == APR_SUCCESS) { + mutex->curr_locked = 1; } + break; + } + if (timeout <= 0) { + rv = APR_TIMEUP; + break; + } + if (timeout > SLEEP_TIME) { + apr_sleep(SLEEP_TIME); + timeout -= SLEEP_TIME; + } + else { + apr_sleep(timeout); + timeout = 0; } } return rv; @@ -230,10 +225,7 @@ static apr_status_t proc_mutex_posix_tryacquire(apr_proc_mutex_t *mutex) static apr_status_t proc_mutex_posix_timedacquire(apr_proc_mutex_t *mutex, apr_interval_time_t timeout) { - if (timeout < 0) { - return proc_mutex_posix_acquire(mutex); - } - else if (!timeout) { + if (timeout <= 0) { apr_status_t rv = proc_mutex_posix_tryacquire(mutex); return (rv == APR_EBUSY) ? APR_TIMEUP : rv; } @@ -388,10 +380,7 @@ static apr_status_t proc_mutex_sysv_tryacquire(apr_proc_mutex_t *mutex) static apr_status_t proc_mutex_sysv_timedacquire(apr_proc_mutex_t *mutex, apr_interval_time_t timeout) { - if (timeout < 0) { - return proc_mutex_sysv_acquire(mutex); - } - else if (!timeout) { + if (timeout <= 0) { apr_status_t rv = proc_mutex_sysv_tryacquire(mutex); return (rv == APR_EBUSY) ? APR_TIMEUP : rv; } @@ -515,9 +504,6 @@ typedef struct { } proc_pthread_mutex_t; -static apr_status_t proc_mutex_pthread_timedacquire(apr_proc_mutex_t *mutex, - apr_interval_time_t timeout); - static APR_INLINE int proc_pthread_mutex_inc(apr_proc_mutex_t *mutex) { if (mutex->pthread_refcounting) { @@ -696,19 +682,8 @@ static apr_status_t proc_mutex_pthread_child_init(apr_proc_mutex_t **mutex, return APR_SUCCESS; } -static apr_status_t proc_mutex_pthread_acquire(apr_proc_mutex_t *mutex) -{ - return proc_mutex_pthread_timedacquire(mutex, -1); -} - -static apr_status_t proc_mutex_pthread_tryacquire(apr_proc_mutex_t *mutex) -{ - apr_status_t rv = proc_mutex_pthread_timedacquire(mutex, 0); - return (rv == APR_TIMEUP) ? APR_EBUSY : rv; -} - -static apr_status_t proc_mutex_pthread_timedacquire(apr_proc_mutex_t *mutex, - apr_interval_time_t timeout) +static apr_status_t proc_mutex_pthread_acquire_ex(apr_proc_mutex_t *mutex, + apr_interval_time_t timeout) { #if !APR_USE_PROC_PTHREAD_MUTEX_COND && !defined(HAVE_PTHREAD_MUTEX_TIMEDLOCK) return proc_mutex_spinsleep_timedacquire(mutex, timeout); @@ -840,6 +815,23 @@ static apr_status_t proc_mutex_pthread_timedacquire(apr_proc_mutex_t *mutex, #endif } +static apr_status_t proc_mutex_pthread_acquire(apr_proc_mutex_t *mutex) +{ + return proc_mutex_pthread_acquire_ex(mutex, -1); +} + +static apr_status_t proc_mutex_pthread_tryacquire(apr_proc_mutex_t *mutex) +{ + apr_status_t rv = proc_mutex_pthread_acquire_ex(mutex, 0); + return (rv == APR_TIMEUP) ? APR_EBUSY : rv; +} + +static apr_status_t proc_mutex_pthread_timedacquire(apr_proc_mutex_t *mutex, + apr_interval_time_t timeout) +{ + return proc_mutex_pthread_acquire_ex(mutex, (timeout <= 0) ? 0 : timeout); +} + static apr_status_t proc_mutex_pthread_release(apr_proc_mutex_t *mutex) { apr_status_t rv; diff --git a/locks/unix/thread_mutex.c b/locks/unix/thread_mutex.c index 6a26ff239..cf859e6ad 100644 --- a/locks/unix/thread_mutex.c +++ b/locks/unix/thread_mutex.c @@ -195,15 +195,7 @@ APR_DECLARE(apr_status_t) apr_thread_mutex_timedlock(apr_thread_mutex_t *mutex, apr_status_t rv = APR_ENOTIMPL; #ifdef HAVE_PTHREAD_MUTEX_TIMEDLOCK - if (timeout < 0) { - rv = pthread_mutex_lock(&mutex->mutex); -#ifdef HAVE_ZOS_PTHREADS - if (rv) { - rv = errno; - } -#endif - } - else if (!timeout) { + if (timeout <= 0) { rv = pthread_mutex_trylock(&mutex->mutex); if (rv) { #ifdef HAVE_ZOS_PTHREADS @@ -244,18 +236,12 @@ APR_DECLARE(apr_status_t) apr_thread_mutex_timedlock(apr_thread_mutex_t *mutex, } if (mutex->locked) { - if (!timeout) { + if (timeout <= 0) { rv = APR_TIMEUP; } else { mutex->num_waiters++; - if (timeout < 0) { - rv = apr_thread_cond_wait(mutex->cond, mutex); - } - else { - rv = apr_thread_cond_timedwait(mutex->cond, mutex, - timeout); - } + rv = apr_thread_cond_timedwait(mutex->cond, mutex, timeout); #ifdef HAVE_ZOS_PTHREADS if (rv) { rv = errno; diff --git a/locks/win32/proc_mutex.c b/locks/win32/proc_mutex.c index c85853d63..648c7a14d 100644 --- a/locks/win32/proc_mutex.c +++ b/locks/win32/proc_mutex.c @@ -167,18 +167,13 @@ APR_DECLARE(apr_status_t) apr_proc_mutex_trylock(apr_proc_mutex_t *mutex) APR_DECLARE(apr_status_t) apr_proc_mutex_timedlock(apr_proc_mutex_t *mutex, apr_interval_time_t timeout) { - DWORD rv; + DWORD rv, timeout_ms = (timeout <= 0) ? 0 : apr_time_as_msec(timeout); - if (timeout < 0) { - rv = WaitForSingleObject(mutex->handle, INFINITE); - } - else { - rv = WaitForSingleObject(mutex->handle, apr_time_as_msec(timeout)); - if (rv == WAIT_TIMEOUT) { - return APR_TIMEUP; - } - } + rv = WaitForSingleObject(mutex->handle, timeout_ms); + if (rv == WAIT_TIMEOUT) { + return APR_TIMEUP; + } if (rv == WAIT_OBJECT_0 || rv == WAIT_ABANDONED) { return APR_SUCCESS; } diff --git a/locks/win32/thread_mutex.c b/locks/win32/thread_mutex.c index 49198427a..2eac69cdb 100644 --- a/locks/win32/thread_mutex.c +++ b/locks/win32/thread_mutex.c @@ -118,13 +118,7 @@ APR_DECLARE(apr_status_t) apr_thread_mutex_timedlock(apr_thread_mutex_t *mutex, apr_interval_time_t timeout) { if (mutex->type != thread_mutex_critical_section) { - DWORD rv, timeout_ms; - if (timeout < 0) { - timeout_ms = INFINITE; - } - else { - timeout_ms = apr_time_as_msec(timeout); - } + DWORD rv, timeout_ms = (timeout <= 0) ? 0 : apr_time_as_msec(timeout); rv = WaitForSingleObject(mutex->handle, timeout_ms); if ((rv != WAIT_OBJECT_0) && (rv != WAIT_ABANDONED)) { return (rv == WAIT_TIMEOUT) ? APR_TIMEUP : apr_get_os_error(); |