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 17:41:18 UTC

svn commit: r1795940 - in /apr/apr/branches/1.6.x: ./ include/ include/arch/unix/ locks/beos/ locks/netware/ locks/os2/ locks/unix/ locks/win32/ test/

Author: wrowe
Date: Tue May 23 17:41:17 2017
New Revision: 1795940

URL: http://svn.apache.org/viewvc?rev=1795940&view=rev
Log:
Revert 1790490 (r1790488 from trunk), was;

locks: follow up to r1667900.

Axe the 'absolute' argument of apr_{thread,proc,global}_mutex_timedlock()
which was confusing, hence 'timeout' is always relative now.

It still makes sense (to me) to handle a negative timeout as INFINITE, a nul
one as IMMEDIATE, and a positive one as an upper bound timeout (like most if
not all of the underlying system calls...).

Modified:
    apr/apr/branches/1.6.x/   (props changed)
    apr/apr/branches/1.6.x/include/apr_global_mutex.h
    apr/apr/branches/1.6.x/include/apr_proc_mutex.h
    apr/apr/branches/1.6.x/include/apr_thread_mutex.h
    apr/apr/branches/1.6.x/include/arch/unix/apr_arch_proc_mutex.h
    apr/apr/branches/1.6.x/locks/beos/proc_mutex.c
    apr/apr/branches/1.6.x/locks/beos/thread_mutex.c
    apr/apr/branches/1.6.x/locks/netware/proc_mutex.c
    apr/apr/branches/1.6.x/locks/netware/thread_mutex.c
    apr/apr/branches/1.6.x/locks/os2/proc_mutex.c
    apr/apr/branches/1.6.x/locks/os2/thread_mutex.c
    apr/apr/branches/1.6.x/locks/unix/global_mutex.c
    apr/apr/branches/1.6.x/locks/unix/proc_mutex.c
    apr/apr/branches/1.6.x/locks/unix/thread_mutex.c
    apr/apr/branches/1.6.x/locks/win32/proc_mutex.c
    apr/apr/branches/1.6.x/locks/win32/thread_mutex.c
    apr/apr/branches/1.6.x/test/testlock.c
    apr/apr/branches/1.6.x/test/testlockperf.c
    apr/apr/branches/1.6.x/test/testprocmutex.c

Propchange: apr/apr/branches/1.6.x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue May 23 17:41:17 2017
@@ -1,4 +1,4 @@
 /apr/apr/branches/1.4.x:1003369,1101301
-/apr/apr/trunk:733052,739635,741862,741866-741867,741869,741871,745763-745764,746310,747990,748080,748361,748371,748565,748888,748902,748988,749810,760443,767895,775683,782838,783398,783958,784633,784773,788588,789050,793192-793193,794118,794485,795267,799497,800627,809745,809854,810472,811455,813063,821306,829490,831641,832904,835607,888669,892028,892159,892435,892909,896382,896653,899905,901088,902077,902090,908427,910419,910597,917819,917837-917838,923311,923320,925965,929796,930508,931973,932585,951771,960665,960671,979891,983618,989450,990435,1003338,1044440,1044447,1055657,1072165,1078845,1081462,1081495,1083038,1083242,1084662,1086695,1088023,1089031,1089129,1089438,1099348,1103310,1183683,1183685-1183686,1183688,1183693,1183698,1213382,1235047,1236970,1237078,1237507,1240472,1340286,1340288,1340470,1341193,1341196,1343233,1343243,1367050,1368819,1370494,1372018,1372022,1372093,1372849,1376957,1384764,1389077,1400200,1402868,1405985,1406690,1420106,1420109,1425356,1428809,143
 8940,1438957-1438959,1442903,1449568,1456418,1459994,1460179-1460180,1460241,1460399,1460405,1462738,1462813,1470186,1470348,1475509,1478905,1480067,1481262,1481265,1484271,1487796,1489517,1496407,1502804,1510354,1516261,1523384,1523479,1523484,1523505,1523521,1523604,1523613,1523615,1523844-1523845,1523853,1524014,1524031,1528797,1528809,1529488,1529495,1529515,1529521,1529668,1530786,1530800,1530988,1531554,1531768,1531884,1532022,1533104,1533111,1533979,1535027,1535157,1536744,1538171,1539374,1539389,1539455,1539603,1541054,1541061,1541486,1541655,1541666,1541744,1542601,1542779,1543033,1543056,1548575,1550907,1551650,1551659,1558905,1559382,1559873,1559975,1561040,1561260,1561265,1561321,1561347,1561356,1561361,1561394,1561555,1571894,1575509,1578420,1587045,1587063,1587543,1587545,1588878,1588937,1589982,1593611,1593614-1593615,1593680,1594684,1594708,1595549,1597797,1597803,1604590,1604596,1604598,1605104,1610854,1611023,1611107,1611110,1611117,1611120,1611125,1611184,1611193,
 1611466,1611515,1611517,1625173,1626564,1634615,1642159,1648830,1664406,1664447,1664451,1664471,1664769-1664770,1664775,1664904,1664911,1664958,1666341,1666411,1666458,1666611,1667420-1667421,1667423,1667900-1667901,1667903,1667914-1667916,1667962,1669077,1671292,1671329,1671356,1671386,1671389,1671513-1671514,1671957,1672354,1672366,1672495,1672575,1675644,1675656,1675668,1676013,1685929,1696140,1696767,1722547,1722557,1726928,1727020,1727160,1727175,1727199,1728957,1732582,1733451,1733594,1733694,1733706,1733708,1733775,1734816,1736552,1738791,1738925,1750374,1755709,1755740,1755746,1755758,1755954,1761279,1762326,1774712,1774973,1775069,1776994,1776998,1788334,1788337,1789947,1789998,1790045,1790200,1790296,1790302-1790304,1790330-1790331,1790436,1790439,1790444,1790446,1790488,1791598,1791718,1792961,1792963
+/apr/apr/trunk:733052,739635,741862,741866-741867,741869,741871,745763-745764,746310,747990,748080,748361,748371,748565,748888,748902,748988,749810,760443,767895,775683,782838,783398,783958,784633,784773,788588,789050,793192-793193,794118,794485,795267,799497,800627,809745,809854,810472,811455,813063,821306,829490,831641,832904,835607,888669,892028,892159,892435,892909,896382,896653,899905,901088,902077,902090,908427,910419,910597,917819,917837-917838,923311,923320,925965,929796,930508,931973,932585,951771,960665,960671,979891,983618,989450,990435,1003338,1044440,1044447,1055657,1072165,1078845,1081462,1081495,1083038,1083242,1084662,1086695,1088023,1089031,1089129,1089438,1099348,1103310,1183683,1183685-1183686,1183688,1183693,1183698,1213382,1235047,1236970,1237078,1237507,1240472,1340286,1340288,1340470,1341193,1341196,1343233,1343243,1367050,1368819,1370494,1372018,1372022,1372093,1372849,1376957,1384764,1389077,1400200,1402868,1405985,1406690,1420106,1420109,1425356,1428809,143
 8940,1438957-1438959,1442903,1449568,1456418,1459994,1460179-1460180,1460241,1460399,1460405,1462738,1462813,1470186,1470348,1475509,1478905,1480067,1481262,1481265,1484271,1487796,1489517,1496407,1502804,1510354,1516261,1523384,1523479,1523484,1523505,1523521,1523604,1523613,1523615,1523844-1523845,1523853,1524014,1524031,1528797,1528809,1529488,1529495,1529515,1529521,1529668,1530786,1530800,1530988,1531554,1531768,1531884,1532022,1533104,1533111,1533979,1535027,1535157,1536744,1538171,1539374,1539389,1539455,1539603,1541054,1541061,1541486,1541655,1541666,1541744,1542601,1542779,1543033,1543056,1548575,1550907,1551650,1551659,1558905,1559382,1559873,1559975,1561040,1561260,1561265,1561321,1561347,1561356,1561361,1561394,1561555,1571894,1575509,1578420,1587045,1587063,1587543,1587545,1588878,1588937,1589982,1593611,1593614-1593615,1593680,1594684,1594708,1595549,1597797,1597803,1604590,1604596,1604598,1605104,1610854,1611023,1611107,1611110,1611117,1611120,1611125,1611184,1611193,
 1611466,1611515,1611517,1625173,1626564,1634615,1642159,1648830,1664406,1664447,1664451,1664471,1664769-1664770,1664775,1664904,1664911,1664958,1666341,1666411,1666458,1666611,1667420-1667421,1667423,1667900-1667901,1667903,1667914-1667916,1667962,1669077,1671292,1671329,1671356,1671386,1671389,1671513-1671514,1671957,1672354,1672366,1672495,1672575,1675644,1675656,1675668,1676013,1685929,1696140,1696767,1722547,1722557,1726928,1727020,1727160,1727175,1727199,1728957,1732582,1733451,1733594,1733694,1733706,1733708,1733775,1734816,1736552,1738791,1738925,1750374,1755709,1755740,1755746,1755758,1755954,1761279,1762326,1774712,1774973,1775069,1776994,1776998,1788334,1788337,1789947,1789998,1790045,1790200,1790296,1790302-1790304,1790330-1790331,1790436,1790439,1790444,1790446,1791598,1791718,1792961,1792963
 /apr/apr/trunk/test/testnames.c:1460405
 /httpd/httpd/trunk:1604590

Modified: apr/apr/branches/1.6.x/include/apr_global_mutex.h
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/include/apr_global_mutex.h?rev=1795940&r1=1795939&r2=1795940&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/include/apr_global_mutex.h (original)
+++ apr/apr/branches/1.6.x/include/apr_global_mutex.h Tue May 23 17:41:17 2017
@@ -114,10 +114,12 @@ APR_DECLARE(apr_status_t) apr_global_mut
  * Attempt to acquire the lock for the given mutex until timeout expires.
  * If the acquisition time outs, the call returns with APR_TIMEUP.
  * @param mutex the mutex on which to attempt the lock acquiring.
- * @param timeout the relative timeout (microseconds)
+ * @param timeout the absolute time or relative timeout (microseconds)
+ * @param absolute whether the timeout given is absolute (!0) or relative (0)
  */
 APR_DECLARE(apr_status_t) apr_global_mutex_timedlock(apr_global_mutex_t *mutex,
-                                                     apr_time_t timeout);
+                                                     apr_time_t timeout,
+                                                     int absolute);
 
 /**
  * Release the lock for the given mutex.

Modified: apr/apr/branches/1.6.x/include/apr_proc_mutex.h
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/include/apr_proc_mutex.h?rev=1795940&r1=1795939&r2=1795940&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/include/apr_proc_mutex.h (original)
+++ apr/apr/branches/1.6.x/include/apr_proc_mutex.h Tue May 23 17:41:17 2017
@@ -119,10 +119,12 @@ APR_DECLARE(apr_status_t) apr_proc_mutex
  * Attempt to acquire the lock for the given mutex until timeout expires.
  * If the acquisition time outs, the call returns with APR_TIMEUP.
  * @param mutex the mutex on which to attempt the lock acquiring.
- * @param timeout the relative timeout (microseconds)
+ * @param timeout the absolute time or relative timeout (microseconds)
+ * @param absolute whether the timeout given is absolute (!0) or relative (0)
  */
 APR_DECLARE(apr_status_t) apr_proc_mutex_timedlock(apr_proc_mutex_t *mutex,
-                                                   apr_time_t timeout);
+                                                   apr_time_t timeout,
+                                                   int absolute);
 
 /**
  * Release the lock for the given mutex.

Modified: apr/apr/branches/1.6.x/include/apr_thread_mutex.h
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/include/apr_thread_mutex.h?rev=1795940&r1=1795939&r2=1795940&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/include/apr_thread_mutex.h (original)
+++ apr/apr/branches/1.6.x/include/apr_thread_mutex.h Tue May 23 17:41:17 2017
@@ -87,10 +87,12 @@ APR_DECLARE(apr_status_t) apr_thread_mut
  * Attempt to acquire the lock for the given mutex until timeout expires.
  * If the acquisition time outs, the call returns with APR_TIMEUP.
  * @param mutex the mutex on which to attempt the lock acquiring.
- * @param timeout the relative timeout (microseconds)
+ * @param timeout the absolute time or relative timeout (microseconds)
+ * @param absolute whether the timeout given is absolute (!0) or relative (0)
  */
 APR_DECLARE(apr_status_t) apr_thread_mutex_timedlock(apr_thread_mutex_t *mutex,
-                                                     apr_time_t timeout);
+                                                     apr_time_t timeout,
+                                                     int absolute);
 
 /**
  * Release the lock for the given mutex.

Modified: apr/apr/branches/1.6.x/include/arch/unix/apr_arch_proc_mutex.h
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/include/arch/unix/apr_arch_proc_mutex.h?rev=1795940&r1=1795939&r2=1795940&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/include/arch/unix/apr_arch_proc_mutex.h (original)
+++ apr/apr/branches/1.6.x/include/arch/unix/apr_arch_proc_mutex.h Tue May 23 17:41:17 2017
@@ -70,7 +70,7 @@ struct apr_proc_mutex_unix_lock_methods_
     apr_status_t (*create)(apr_proc_mutex_t *, const char *);
     apr_status_t (*acquire)(apr_proc_mutex_t *);
     apr_status_t (*tryacquire)(apr_proc_mutex_t *);
-    apr_status_t (*timedacquire)(apr_proc_mutex_t *, apr_time_t);
+    apr_status_t (*timedacquire)(apr_proc_mutex_t *, apr_time_t, int);
     apr_status_t (*release)(apr_proc_mutex_t *);
     apr_status_t (*cleanup)(void *);
     apr_status_t (*child_init)(apr_proc_mutex_t **, apr_pool_t *, const char *);

Modified: apr/apr/branches/1.6.x/locks/beos/proc_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/locks/beos/proc_mutex.c?rev=1795940&r1=1795939&r2=1795940&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/locks/beos/proc_mutex.c (original)
+++ apr/apr/branches/1.6.x/locks/beos/proc_mutex.c Tue May 23 17:41:17 2017
@@ -109,20 +109,33 @@ APR_DECLARE(apr_status_t) apr_proc_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)
 {
     int32 stat;
 
     if (atomic_add(&mutex->LockCount, 1) > 0) {
-        if (!timeout) {
-            stat = B_TIMED_OUT;
-        }
-        else if (timeout < 0) {
+        if (timeout < 0) {
             stat = acquire_sem(mutex->Lock);
         }
         else {
-            stat = acquire_sem_etc(mutex->Lock, 1, B_RELATIVE_TIMEOUT,
-                                   timeout);
+            int flag = 0;
+            if (timeout > 0) {
+                if (absolute) {
+                    apr_time_t now = apr_time_now();
+                    if (timeout > now) {
+                        timeout -= now;
+                    }
+                    else {
+                        timeout = 0;
+                    }
+                    flag = B_ABSOLUTE_TIMEOUT;
+                }
+                else {
+                    flag = B_RELATIVE_TIMEOUT;
+                }
+            }
+            stat = acquire_sem_etc(mutex->Lock, 1, flag, timeout);
         }
         if (stat < B_NO_ERROR) {
             atomic_add(&mutex->LockCount, -1);

Modified: apr/apr/branches/1.6.x/locks/beos/thread_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/locks/beos/thread_mutex.c?rev=1795940&r1=1795939&r2=1795940&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/locks/beos/thread_mutex.c (original)
+++ apr/apr/branches/1.6.x/locks/beos/thread_mutex.c Tue May 23 17:41:17 2017
@@ -132,7 +132,8 @@ APR_DECLARE(apr_status_t) apr_thread_mut
 }
 
 APR_DECLARE(apr_status_t) apr_thread_mutex_timedlock(apr_thread_mutex_t *mutex,
-                                                     apr_time_t timeout)
+                                                     apr_time_t timeout,
+                                                     int absolute)
 {
     int32 stat;
     thread_id me = find_thread(NULL);
@@ -143,15 +144,27 @@ APR_DECLARE(apr_status_t) apr_thread_mut
     }
     
     if (atomic_add(&mutex->LockCount, 1) > 0) {
-        if (!timeout) {
-            stat = B_TIMED_OUT;
-        }
-        else if (timeout < 0) {
+        if (timeout < 0) {
             stat = acquire_sem(mutex->Lock);
         }
         else {
-            stat = acquire_sem_etc(mutex->Lock, 1, B_RELATIVE_TIMEOUT,
-                                   timeout);
+            int flag = 0;
+            if (timeout > 0) {
+                if (absolute) {
+                    apr_time_t now = apr_time_now();
+                    if (timeout > now) {
+                        timeout -= now;
+                    }
+                    else {
+                        timeout = 0;
+                    }
+                    flag = B_ABSOLUTE_TIMEOUT;
+                }
+                else {
+                    flag = B_RELATIVE_TIMEOUT;
+                }
+            }
+            stat = acquire_sem_etc(mutex->Lock, 1, flag, timeout);
         }
         if (stat < B_NO_ERROR) {
             atomic_add(&mutex->LockCount, -1);

Modified: apr/apr/branches/1.6.x/locks/netware/proc_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/locks/netware/proc_mutex.c?rev=1795940&r1=1795939&r2=1795940&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/locks/netware/proc_mutex.c (original)
+++ apr/apr/branches/1.6.x/locks/netware/proc_mutex.c Tue May 23 17:41:17 2017
@@ -73,10 +73,11 @@ APR_DECLARE(apr_status_t) apr_proc_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)
 {
     if (mutex)
-        return apr_thread_mutex_timedlock(mutex->mutex, timeout);
+        return apr_thread_mutex_timedlock(mutex->mutex, timeout, absolute);
     return APR_ENOLOCK;
 }
 

Modified: apr/apr/branches/1.6.x/locks/netware/thread_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/locks/netware/thread_mutex.c?rev=1795940&r1=1795939&r2=1795940&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/locks/netware/thread_mutex.c (original)
+++ apr/apr/branches/1.6.x/locks/netware/thread_mutex.c Tue May 23 17:41:17 2017
@@ -112,26 +112,30 @@ APR_DECLARE(apr_status_t) apr_thread_mut
 }
 
 APR_DECLARE(apr_status_t) apr_thread_mutex_timedlock(apr_thread_mutex_t *mutex,
-                                                     apr_time_t timeout)
+                                                     apr_time_t timeout,
+                                                     int absolute)
 {
     if (mutex->cond) {
         apr_status_t rv;
         NXLock(mutex->mutex);
         if (mutex->locked) {
-            if (!timeout) {
-                rv = APR_TIMEUP;
+            mutex->num_waiters++;
+            if (timeout < 0) {
+                rv = apr_thread_cond_wait(mutex->cond, mutex);
             }
             else {
-                mutex->num_waiters++;
-                if (timeout < 0) {
-                    rv = apr_thread_cond_wait(mutex->cond, mutex);
+                if (absolute) {
+                    apr_time_t now = apr_time_now();
+                    if (timeout > now) {
+                        timeout -= now;
+                    }
+                    else {
+                        timeout = 0;
+                    }
                 }
-                else {
-                    rv = apr_thread_cond_timedwait(mutex->cond, mutex,
-                                                   timeout);
-                }
-                mutex->num_waiters--;
+                rv = apr_thread_cond_timedwait(mutex->cond, mutex, timeout);
             }
+            mutex->num_waiters--;
         }
         else {
             mutex->locked = 1;

Modified: apr/apr/branches/1.6.x/locks/os2/proc_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/locks/os2/proc_mutex.c?rev=1795940&r1=1795939&r2=1795940&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/locks/os2/proc_mutex.c (original)
+++ apr/apr/branches/1.6.x/locks/os2/proc_mutex.c Tue May 23 17:41:17 2017
@@ -156,24 +156,35 @@ APR_DECLARE(apr_status_t) apr_proc_mutex
         mutex->lock_count++;
     }
 
-    return (rc == ERROR_TIMEOUT) ? APR_EBUSY : APR_FROM_OS_ERROR(rc);
+    return APR_FROM_OS_ERROR(rc);
 }
 
 
 
 APR_DECLARE(apr_status_t) apr_proc_mutex_timedlock(apr_proc_mutex_t *mutex,
-                                                   apr_time_t timeout)
+                                                   apr_time_t timeout,
+                                                   int absolute)
 {
     ULONG rc;
     
     if (timeout < 0) {
         rc = DosRequestMutexSem(mutex->hMutex, SEM_INDEFINITE_WAIT);
     }
-    else if (!timeout) {
-        rc = DosRequestMutexSem(mutex->hMutex, SEM_IMMEDIATE_RETURN);
-    }
     else {
+        if (absolute) {
+            apr_time_t now = apr_time_now();
+            if (timeout > now) {
+                timeout -= now;
+            }
+            else {
+                timeout = 0;
+            }
+        }
+
         rc = DosRequestMutexSem(mutex->hMutex, apr_time_as_msec(timeout));
+        if (rc == ERROR_TIMEOUT) {
+            return APR_TIMEUP;
+        }
     }
 
     if (rc == 0) {
@@ -181,7 +192,7 @@ APR_DECLARE(apr_status_t) apr_proc_mutex
         mutex->lock_count++;
     }
 
-    return (rc == ERROR_TIMEOUT) ? APR_TIMEUP : APR_FROM_OS_ERROR(rc);
+    return APR_FROM_OS_ERROR(rc);
 }
 
 

Modified: apr/apr/branches/1.6.x/locks/os2/thread_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/locks/os2/thread_mutex.c?rev=1795940&r1=1795939&r2=1795940&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/locks/os2/thread_mutex.c (original)
+++ apr/apr/branches/1.6.x/locks/os2/thread_mutex.c Tue May 23 17:41:17 2017
@@ -66,28 +66,37 @@ APR_DECLARE(apr_status_t) apr_thread_mut
 APR_DECLARE(apr_status_t) apr_thread_mutex_trylock(apr_thread_mutex_t *mutex)
 {
     ULONG rc = DosRequestMutexSem(mutex->hMutex, SEM_IMMEDIATE_RETURN);
-
-    return (rc == ERROR_TIMEOUT) ? APR_EBUSY : APR_FROM_OS_ERROR(rc);
+    return APR_OS2_STATUS(rc);
 }
 
 
 
 APR_DECLARE(apr_status_t) apr_thread_mutex_timedlock(apr_thread_mutex_t *mutex,
-                                                     apr_time_t timeout)
+                                                     apr_time_t timeout,
+                                                     int absolute)
 {
     ULONG rc;
 
     if (timeout < 0) {
         rc = DosRequestMutexSem(mutex->hMutex, SEM_INDEFINITE_WAIT);
     }
-    else if (!timeout) {
-        rc = DosRequestMutexSem(mutex->hMutex, SEM_IMMEDIATE_RETURN);
-    }
     else {
-        rc = DosRequestMutexSem(mutex->hMutex, apr_time_as_msec(timeout));
+        if (absolute) {
+            apr_time_t now = apr_time_now();
+            if (timeout > now) {
+                timeout -= now;
+            }
+            else {
+                timeout = 0;
+            }
+        }
+        rc = DosRequestMutexSem(mutex->hMutex, apr_time_as_msec(usec));
+        if (rc == ERROR_TIMEOUT) {
+            return APR_TIMEUP;
+        }
     }
 
-    return (rc == ERROR_TIMEOUT) ? APR_TIMEUP : APR_FROM_OS_ERROR(rc);
+    return APR_FROM_OS_ERROR(rc);
 }
 
 

Modified: apr/apr/branches/1.6.x/locks/unix/global_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/locks/unix/global_mutex.c?rev=1795940&r1=1795939&r2=1795940&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/locks/unix/global_mutex.c (original)
+++ apr/apr/branches/1.6.x/locks/unix/global_mutex.c Tue May 23 17:41:17 2017
@@ -143,30 +143,27 @@ APR_DECLARE(apr_status_t) apr_global_mut
 }
 
 APR_DECLARE(apr_status_t) apr_global_mutex_timedlock(apr_global_mutex_t *mutex,
-                                                     apr_time_t timeout)
+                                                     apr_time_t timeout,
+                                                     int absolute)
 {
     apr_status_t rv;
 
 #if APR_HAS_THREADS
     if (mutex->thread_mutex) {
-        apr_time_t expiry = 0;
-        if (timeout > 0) {
-            expiry = apr_time_now() + timeout;
+        if (timeout >= 0 && !absolute) {
+            timeout += apr_time_now();
+            absolute = 1;
         }
-        rv = apr_thread_mutex_timedlock(mutex->thread_mutex, timeout);
+        rv = apr_thread_mutex_timedlock(mutex->thread_mutex, timeout,
+                                        absolute);
         if (rv != APR_SUCCESS) {
             return rv;
         }
-        if (expiry) {
-            timeout = expiry - apr_time_now();
-            if (timeout < 0) {
-                timeout = 0;
-            }
-        }
     }
 #endif /* APR_HAS_THREADS */
 
-    rv = apr_proc_mutex_timedlock(mutex->proc_mutex, timeout);
+    rv = apr_proc_mutex_timedlock(mutex->proc_mutex, timeout,
+                                  absolute);
 
 #if APR_HAS_THREADS
     if (rv != APR_SUCCESS) {

Modified: apr/apr/branches/1.6.x/locks/unix/proc_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/locks/unix/proc_mutex.c?rev=1795940&r1=1795939&r2=1795940&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/locks/unix/proc_mutex.c (original)
+++ apr/apr/branches/1.6.x/locks/unix/proc_mutex.c Tue May 23 17:41:17 2017
@@ -56,9 +56,16 @@ static apr_status_t proc_mutex_no_perms_
         && !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_try
 
 #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_trya
 
 #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_c
 
 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_t
             }
             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_t
         }
         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
 }
 
 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)

Modified: apr/apr/branches/1.6.x/locks/unix/thread_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/locks/unix/thread_mutex.c?rev=1795940&r1=1795939&r2=1795940&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/locks/unix/thread_mutex.c (original)
+++ apr/apr/branches/1.6.x/locks/unix/thread_mutex.c Tue May 23 17:41:17 2017
@@ -190,34 +190,26 @@ APR_DECLARE(apr_status_t) apr_thread_mut
 }
 
 APR_DECLARE(apr_status_t) apr_thread_mutex_timedlock(apr_thread_mutex_t *mutex,
-                                                     apr_time_t timeout)
+                                                     apr_time_t timeout,
+                                                     int absolute)
 {
     apr_status_t rv = APR_ENOTIMPL;
 
 #ifdef HAVE_PTHREAD_MUTEX_TIMEDLOCK
     if (timeout < 0) {
         rv = pthread_mutex_lock(&mutex->mutex);
-#ifdef HAVE_ZOS_PTHREADS
-        if (rv) {
-            rv = errno;
-        }
-#endif
-    }
-    else if (!timeout) {
-        rv = pthread_mutex_trylock(&mutex->mutex);
         if (rv) {
 #ifdef HAVE_ZOS_PTHREADS
             rv = errno;
 #endif
-            if (rv == EBUSY) {
-                rv = APR_TIMEUP;
-            }
         }
     }
     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 */
 
@@ -235,6 +227,8 @@ APR_DECLARE(apr_status_t) apr_thread_mut
 #else /* HAVE_PTHREAD_MUTEX_TIMEDLOCK */
 
     if (mutex->cond) {
+        apr_status_t rv2;
+
         rv = pthread_mutex_lock(&mutex->mutex);
         if (rv) {
 #ifdef HAVE_ZOS_PTHREADS
@@ -244,40 +238,35 @@ APR_DECLARE(apr_status_t) apr_thread_mut
         }
 
         if (mutex->locked) {
-            if (!timeout) {
-                rv = APR_TIMEUP;
+            mutex->num_waiters++;
+            if (timeout < 0) {
+                rv = apr_thread_cond_wait(mutex->cond, mutex);
             }
             else {
-                mutex->num_waiters++;
-                if (timeout < 0) {
-                    rv = apr_thread_cond_wait(mutex->cond, mutex);
-                }
-                else {
-                    rv = apr_thread_cond_timedwait(mutex->cond, mutex,
-                                                   timeout);
+                if (absolute) {
+                    apr_time_t now = apr_time_now();
+                    if (timeout > now) {
+                        timeout -= now;
+                    }
+                    else {
+                        timeout = 0;
+                    }
                 }
-#ifdef HAVE_ZOS_PTHREADS
-                if (rv) {
-                    rv = errno;
-                }
-#endif
-                mutex->num_waiters--;
+                rv = apr_thread_cond_timedwait(mutex->cond, mutex, timeout);
             }
+            mutex->num_waiters--;
         }
         else {
             mutex->locked = 1;
         }
-        if (rv) {
-            pthread_mutex_unlock(&mutex->mutex);
-            return rv;
-        }
 
-        rv = pthread_mutex_unlock(&mutex->mutex);
-        if (rv) {
+        rv2 = pthread_mutex_unlock(&mutex->mutex);
+        if (rv2 && !rv) {
 #ifdef HAVE_ZOS_PTHREADS
             rv = errno;
+#else
+            rv = rv2;
 #endif
-            return rv;
         }
     }
 

Modified: apr/apr/branches/1.6.x/locks/win32/proc_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/locks/win32/proc_mutex.c?rev=1795940&r1=1795939&r2=1795940&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/locks/win32/proc_mutex.c (original)
+++ apr/apr/branches/1.6.x/locks/win32/proc_mutex.c Tue May 23 17:41:17 2017
@@ -165,7 +165,8 @@ APR_DECLARE(apr_status_t) apr_proc_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)
 {
     DWORD rv;
 
@@ -173,6 +174,15 @@ APR_DECLARE(apr_status_t) apr_proc_mutex
         rv = WaitForSingleObject(mutex->handle, INFINITE);
     }
     else {
+        if (absolute) {
+            apr_time_t now = apr_time_now();
+            if (timeout > now) {
+                timeout -= now;
+            }
+            else {
+                timeout = 0;
+            }
+        }
         rv = WaitForSingleObject(mutex->handle, apr_time_as_msec(timeout));
         if (rv == WAIT_TIMEOUT) {
             return APR_TIMEUP;

Modified: apr/apr/branches/1.6.x/locks/win32/thread_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/locks/win32/thread_mutex.c?rev=1795940&r1=1795939&r2=1795940&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/locks/win32/thread_mutex.c (original)
+++ apr/apr/branches/1.6.x/locks/win32/thread_mutex.c Tue May 23 17:41:17 2017
@@ -115,7 +115,8 @@ APR_DECLARE(apr_status_t) apr_thread_mut
 }
 
 APR_DECLARE(apr_status_t) apr_thread_mutex_timedlock(apr_thread_mutex_t *mutex,
-                                                     apr_time_t timeout)
+                                                     apr_time_t timeout,
+                                                     int absolute)
 {
     if (mutex->type != thread_mutex_critical_section) {
         DWORD rv, timeout_ms;
@@ -123,6 +124,15 @@ APR_DECLARE(apr_status_t) apr_thread_mut
             timeout_ms = INFINITE;
         }
         else {
+            if (absolute) {
+                apr_time_t now = apr_time_now();
+                if (timeout > now) {
+                    timeout -= now;
+                }
+                else {
+                    timeout = 0;
+                }
+            }
             timeout_ms = apr_time_as_msec(timeout);
         }
         rv = WaitForSingleObject(mutex->handle, timeout_ms);

Modified: apr/apr/branches/1.6.x/test/testlock.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/test/testlock.c?rev=1795940&r1=1795939&r2=1795940&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/test/testlock.c (original)
+++ apr/apr/branches/1.6.x/test/testlock.c Tue May 23 17:41:17 2017
@@ -91,7 +91,7 @@ static void *APR_THREAD_FUNC thread_mute
     while (1)
     {
         if (data) {
-            apr_thread_mutex_timedlock(thread_mutex, *(apr_time_t *)data);
+            apr_thread_mutex_timedlock(thread_mutex, *(apr_time_t *)data, 0);
         }
         else {
             apr_thread_mutex_lock(thread_mutex);
@@ -361,7 +361,7 @@ static void test_timeoutmutex(abts_case
     ABTS_INT_EQUAL(tc, 0, apr_thread_mutex_lock(timeout_mutex));
     for (i = 0; i < MAX_RETRY; i++) {
         begin = apr_time_now();
-        s = apr_thread_mutex_timedlock(timeout_mutex, timeout);
+        s = apr_thread_mutex_timedlock(timeout_mutex, timeout, 0);
         end = apr_time_now();
 
         if (s != APR_SUCCESS && !APR_STATUS_IS_TIMEUP(s)) {

Modified: apr/apr/branches/1.6.x/test/testlockperf.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/test/testlockperf.c?rev=1795940&r1=1795939&r2=1795940&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/test/testlockperf.c (original)
+++ apr/apr/branches/1.6.x/test/testlockperf.c Tue May 23 17:41:17 2017
@@ -61,7 +61,7 @@ void * APR_THREAD_FUNC thread_mutex_func
 
     for (i = 0; i < max_counter; i++) {
         if (data) {
-            apr_thread_mutex_timedlock(thread_lock, *(apr_time_t *)data);
+            apr_thread_mutex_timedlock(thread_lock, *(apr_time_t *)data, 0);
         }
         else {
             apr_thread_mutex_lock(thread_lock);

Modified: apr/apr/branches/1.6.x/test/testprocmutex.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/test/testprocmutex.c?rev=1795940&r1=1795939&r2=1795940&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/test/testprocmutex.c (original)
+++ apr/apr/branches/1.6.x/test/testprocmutex.c Tue May 23 17:41:17 2017
@@ -88,7 +88,7 @@ static void make_child(abts_case *tc, in
             else if (trylock < 0) {
                 int wait_usec = 0;
 
-                while ((rv = apr_proc_mutex_timedlock(proc_lock, 1))) {
+                while ((rv = apr_proc_mutex_timedlock(proc_lock, 1, 0))) {
                     if (!APR_STATUS_IS_TIMEUP(rv))
                         exit(1);
                     if (++wait_usec >= MAX_WAIT_USEC)
@@ -184,7 +184,7 @@ static void test_exclusive(abts_case *tc
                     *x == MAX_COUNTER);
     }
 
-    rv = apr_proc_mutex_timedlock(proc_lock, 1);
+    rv = apr_proc_mutex_timedlock(proc_lock, 1, 0);
     if (rv == APR_ENOTIMPL) {
         fprintf(stderr, "%s_timedlock() not implemented, ", mech->name);
         ABTS_ASSERT(tc, "Default timed timedlock not implemented",
@@ -194,7 +194,7 @@ static void test_exclusive(abts_case *tc
         APR_ASSERT_SUCCESS(tc, "check for timedlock", rv);
 
         for (n = 0; n < 2; n++) {
-            rv = apr_proc_mutex_timedlock(proc_lock, 1);
+            rv = apr_proc_mutex_timedlock(proc_lock, 1, 0);
             /* Some mech (eg. flock or fcntl) may succeed when the
              * lock is re-acquired in the same process.
              */