diff options
author | jim <jim@13f79535-47bb-0310-9956-ffa450edef68> | 2017-04-05 17:10:04 +0000 |
---|---|---|
committer | jim <jim@13f79535-47bb-0310-9956-ffa450edef68> | 2017-04-05 17:10:04 +0000 |
commit | 7d33de8ff4c11548e300a7f28e9cef957bed7f2f (patch) | |
tree | 96cb85a2d16f7d38023f9fb89b0be30df2935117 /locks | |
parent | 1df2b2d9f9c2de5c635e3623fa304acfb6a6ada8 (diff) | |
download | libapr-7d33de8ff4c11548e300a7f28e9cef957bed7f2f.tar.gz |
semtimedop() takes a delta time, so accept what is given as the "time remaining"
rr1790301
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@1790302 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'locks')
-rw-r--r-- | locks/unix/misc.c | 26 |
1 files changed, 4 insertions, 22 deletions
diff --git a/locks/unix/misc.c b/locks/unix/misc.c index b3bc21828..d7018fc3a 100644 --- a/locks/unix/misc.c +++ b/locks/unix/misc.c @@ -146,41 +146,23 @@ int sem_timedwait(sem_t * sem, const struct timespec *abs_timeout) #if APR_HAS_SYSVSEM_SERIALIZE #if !HAVE_SEMTIMEDOP extern int semtimedop(int semid, struct sembuf *sops, unsigned nsops, - const struct timespec *abs_timeout); + const struct timespec *timeout); /* * A semtimedop() impl for OSX/macOS, which lacks the * real thing. */ int semtimedop(int semid, struct sembuf *sops, unsigned nsops, - const struct timespec *abs_timeout) + const struct timespec *timeout) { int rv; - struct timespec remaining, ts, tod; - apr_time_t now; + struct timespec remaining, ts; struct sembuf proc_mutex_op_try; proc_mutex_op_try.sem_num = 0; proc_mutex_op_try.sem_op = -1; proc_mutex_op_try.sem_flg = SEM_UNDO | IPC_NOWAIT; - remaining = *abs_timeout; - now = apr_time_now(); - tod.tv_sec = apr_time_sec(now); - tod.tv_nsec = apr_time_usec(now) * 1000; /* nanoseconds */ - - remaining.tv_sec -= tod.tv_sec; - if (tod.tv_nsec <= remaining.tv_nsec) { - remaining.tv_nsec -= tod.tv_nsec; - } - else { - remaining.tv_sec--; - remaining.tv_nsec = - (NANOSECS_PER_SEC - (tod.tv_nsec - remaining.tv_nsec)); - } - /* If we had a REALLY small timeout ;) */ - if (remaining.tv_sec < 0) { - return ETIMEDOUT; - } + remaining = *timeout; errno = 0; while (((rv = semop(semid, &proc_mutex_op_try, nsops)) != 0) && (errno == EAGAIN)) { |