You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by wr...@apache.org on 2017/05/23 19:14:12 UTC
svn commit: r1795947 - /apr/apr/branches/1.6.x/locks/unix/misc.c
Author: wrowe
Date: Tue May 23 19:14:12 2017
New Revision: 1795947
URL: http://svn.apache.org/viewvc?rev=1795947&view=rev
Log:
Revert 1790301; was
semtimedop() takes a delta time, so accept what is given as
the "time remaining"
Modified:
apr/apr/branches/1.6.x/locks/unix/misc.c
Modified: apr/apr/branches/1.6.x/locks/unix/misc.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/locks/unix/misc.c?rev=1795947&r1=1795946&r2=1795947&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/locks/unix/misc.c (original)
+++ apr/apr/branches/1.6.x/locks/unix/misc.c Tue May 23 19:14:12 2017
@@ -146,23 +146,41 @@ int sem_timedwait(sem_t * sem, const str
#if APR_HAS_SYSVSEM_SERIALIZE
#if !HAVE_SEMTIMEDOP
extern int semtimedop(int semid, struct sembuf *sops, unsigned nsops,
- const struct timespec *timeout);
+ const struct timespec *abs_timeout);
/*
* A semtimedop() impl for OSX/macOS, which lacks the
* real thing.
*/
int semtimedop(int semid, struct sembuf *sops, unsigned nsops,
- const struct timespec *timeout)
+ const struct timespec *abs_timeout)
{
int rv;
- struct timespec remaining, ts;
+ struct timespec remaining, ts, tod;
+ apr_time_t now;
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 = *timeout;
+ 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;
+ }
errno = 0;
while (((rv = semop(semid, &proc_mutex_op_try, nsops)) != 0)
&& (errno == EAGAIN)) {