diff options
Diffstat (limited to 'locks/unix/proc_mutex.c')
-rw-r--r-- | locks/unix/proc_mutex.c | 64 |
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) |