summaryrefslogtreecommitdiff
path: root/locks/unix/proc_mutex.c
diff options
context:
space:
mode:
Diffstat (limited to 'locks/unix/proc_mutex.c')
-rw-r--r--locks/unix/proc_mutex.c64
1 files changed, 37 insertions, 27 deletions
diff --git a/locks/unix/proc_mutex.c b/locks/unix/proc_mutex.c
index 25ae89c9d..70051d5a9 100644
--- a/locks/unix/proc_mutex.c
+++ b/locks/unix/proc_mutex.c
@@ -56,9 +56,16 @@ static apr_status_t proc_mutex_no_perms_set(apr_proc_mutex_t *mutex,
&& !defined(HAVE_PTHREAD_MUTEX_TIMEDLOCK) \
&& !defined(HAVE_PTHREAD_CONDATTR_SETPSHARED))
static apr_status_t proc_mutex_spinsleep_timedacquire(apr_proc_mutex_t *mutex,
- apr_time_t timeout)
+ apr_time_t timeout,
+ int absolute)
{
apr_status_t rv;
+ if (absolute) {
+ timeout -= apr_time_now();
+ if (timeout < 0) {
+ timeout = 0;
+ }
+ }
if (timeout < 0) {
rv = apr_proc_mutex_lock(mutex);
}
@@ -228,20 +235,19 @@ static apr_status_t proc_mutex_posix_tryacquire(apr_proc_mutex_t *mutex)
#if defined(HAVE_SEM_TIMEDWAIT)
static apr_status_t proc_mutex_posix_timedacquire(apr_proc_mutex_t *mutex,
- apr_time_t timeout)
+ apr_time_t timeout,
+ int absolute)
{
if (timeout < 0) {
return proc_mutex_posix_acquire(mutex);
}
- else if (!timeout) {
- apr_status_t rv = proc_mutex_posix_tryacquire(mutex);
- return (rv == APR_EBUSY) ? APR_TIMEUP : rv;
- }
else {
int rc;
struct timespec abstime;
- timeout += apr_time_now();
+ if (!absolute) {
+ timeout += apr_time_now();
+ }
abstime.tv_sec = apr_time_sec(timeout);
abstime.tv_nsec = apr_time_usec(timeout) * 1000; /* nanoseconds */
@@ -386,22 +392,23 @@ static apr_status_t proc_mutex_sysv_tryacquire(apr_proc_mutex_t *mutex)
#if defined(HAVE_SEMTIMEDOP)
static apr_status_t proc_mutex_sysv_timedacquire(apr_proc_mutex_t *mutex,
- apr_time_t timeout)
+ apr_time_t timeout,
+ int absolute)
{
if (timeout < 0) {
return proc_mutex_sysv_acquire(mutex);
}
- else if (!timeout) {
- apr_status_t rv = proc_mutex_sysv_tryacquire(mutex);
- return (rv == APR_EBUSY) ? APR_TIMEUP : rv;
- }
else {
int rc;
struct timespec reltime;
-
+ if (absolute) {
+ timeout -= apr_time_now();
+ if (timeout < 0) {
+ return proc_mutex_sysv_tryacquire(mutex);
+ }
+ }
reltime.tv_sec = apr_time_sec(timeout);
reltime.tv_nsec = apr_time_usec(timeout) * 1000; /* nanoseconds */
-
do {
rc = semtimedop(mutex->os.crossproc, &proc_mutex_op_on, 1,
&reltime);
@@ -516,7 +523,8 @@ typedef struct {
static apr_status_t proc_mutex_pthread_timedacquire(apr_proc_mutex_t *mutex,
- apr_time_t timeout);
+ apr_time_t timeout,
+ int absolute);
static APR_INLINE int proc_pthread_mutex_inc(apr_proc_mutex_t *mutex)
{
@@ -700,20 +708,21 @@ static apr_status_t proc_mutex_pthread_child_init(apr_proc_mutex_t **mutex,
static apr_status_t proc_mutex_pthread_acquire(apr_proc_mutex_t *mutex)
{
- return proc_mutex_pthread_timedacquire(mutex, -1);
+ return proc_mutex_pthread_timedacquire(mutex, -1, 0);
}
static apr_status_t proc_mutex_pthread_tryacquire(apr_proc_mutex_t *mutex)
{
- apr_status_t rv = proc_mutex_pthread_timedacquire(mutex, 0);
+ apr_status_t rv = proc_mutex_pthread_timedacquire(mutex, 0, 0);
return (rv == APR_TIMEUP) ? APR_EBUSY : rv;
}
static apr_status_t proc_mutex_pthread_timedacquire(apr_proc_mutex_t *mutex,
- apr_time_t timeout)
+ apr_time_t timeout,
+ int absolute)
{
#if !APR_USE_PROC_PTHREAD_MUTEX_COND && !defined(HAVE_PTHREAD_MUTEX_TIMEDLOCK)
- return proc_mutex_spinsleep_timedacquire(mutex, timeout);
+ return proc_mutex_spinsleep_timedacquire(mutex, timeout, absolute);
#else
apr_status_t rv;
@@ -754,11 +763,11 @@ static apr_status_t proc_mutex_pthread_timedacquire(apr_proc_mutex_t *mutex,
}
else {
struct timespec abstime;
-
- timeout += apr_time_now();
+ if (!absolute) {
+ timeout += apr_time_now();
+ }
abstime.tv_sec = apr_time_sec(timeout);
abstime.tv_nsec = apr_time_usec(timeout) * 1000; /* nanoseconds */
-
rv = pthread_cond_timedwait(&proc_pthread_mutex_cond(mutex),
&proc_pthread_mutex(mutex),
&abstime);
@@ -810,11 +819,11 @@ static apr_status_t proc_mutex_pthread_timedacquire(apr_proc_mutex_t *mutex,
}
else {
struct timespec abstime;
-
- timeout += apr_time_now();
+ if (!absolute) {
+ timeout += apr_time_now();
+ }
abstime.tv_sec = apr_time_sec(timeout);
abstime.tv_nsec = apr_time_usec(timeout) * 1000; /* nanoseconds */
-
rv = pthread_mutex_timedlock(&proc_pthread_mutex(mutex), &abstime);
if (rv) {
#ifdef HAVE_ZOS_PTHREADS
@@ -1565,9 +1574,10 @@ 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_time_t timeout)
+ apr_time_t timeout,
+ int absolute)
{
- return mutex->meth->timedacquire(mutex, timeout);
+ return mutex->meth->timedacquire(mutex, timeout, absolute);
}
APR_DECLARE(apr_status_t) apr_proc_mutex_unlock(apr_proc_mutex_t *mutex)