diff options
Diffstat (limited to 'locks/unix/proc_mutex.c')
-rw-r--r-- | locks/unix/proc_mutex.c | 88 |
1 files changed, 40 insertions, 48 deletions
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; |