summaryrefslogtreecommitdiff
path: root/locks
diff options
context:
space:
mode:
authorYann Ylavic <ylavic@apache.org>2017-04-07 21:17:41 +0000
committerYann Ylavic <ylavic@apache.org>2017-04-07 21:17:41 +0000
commit2ba1280f622fe7c817667c851654406ac98a7c3a (patch)
tree6ca7ed6adef12f5710251ee8ada5eaae306103a4 /locks
parentedf5c6739f468d49932f13fc6ba7a10c2844d730 (diff)
downloadapr-2ba1280f622fe7c817667c851654406ac98a7c3a.tar.gz
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/trunk@1790632 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'locks')
-rw-r--r--locks/beos/proc_mutex.c5
-rw-r--r--locks/beos/thread_mutex.c5
-rw-r--r--locks/netware/thread_mutex.c10
-rw-r--r--locks/os2/proc_mutex.c5
-rw-r--r--locks/os2/thread_mutex.c5
-rw-r--r--locks/unix/proc_mutex.c88
-rw-r--r--locks/unix/thread_mutex.c20
-rw-r--r--locks/win32/proc_mutex.c15
-rw-r--r--locks/win32/thread_mutex.c8
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 f7f46aadd..884004ce2 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 d49bfe10c..8b576a890 100644
--- a/locks/unix/proc_mutex.c
+++ b/locks/unix/proc_mutex.c
@@ -62,32 +62,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;
@@ -224,10 +219,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;
}
@@ -382,10 +374,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;
}
@@ -509,9 +498,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) {
@@ -690,19 +676,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);
@@ -834,6 +809,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();