You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by yl...@apache.org on 2015/03/20 10:16:56 UTC

svn commit: r1667962 - in /apr/apr/trunk/locks: beos/ netware/ os2/ unix/ win32/

Author: ylavic
Date: Fri Mar 20 09:16:56 2015
New Revision: 1667962

URL: http://svn.apache.org/r1667962
Log:
Follow up to r1667900: handle negative (infinite) timeout in mutex/cond timedlock/timedwait.

Modified:
    apr/apr/trunk/locks/beos/proc_mutex.c
    apr/apr/trunk/locks/beos/thread_mutex.c
    apr/apr/trunk/locks/netware/thread_cond.c
    apr/apr/trunk/locks/netware/thread_mutex.c
    apr/apr/trunk/locks/os2/proc_mutex.c
    apr/apr/trunk/locks/os2/thread_cond.c
    apr/apr/trunk/locks/os2/thread_mutex.c
    apr/apr/trunk/locks/unix/global_mutex.c
    apr/apr/trunk/locks/unix/proc_mutex.c
    apr/apr/trunk/locks/unix/thread_cond.c
    apr/apr/trunk/locks/unix/thread_mutex.c
    apr/apr/trunk/locks/win32/proc_mutex.c
    apr/apr/trunk/locks/win32/thread_cond.c
    apr/apr/trunk/locks/win32/thread_mutex.c

Modified: apr/apr/trunk/locks/beos/proc_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/locks/beos/proc_mutex.c?rev=1667962&r1=1667961&r2=1667962&view=diff
==============================================================================
--- apr/apr/trunk/locks/beos/proc_mutex.c (original)
+++ apr/apr/trunk/locks/beos/proc_mutex.c Fri Mar 20 09:16:56 2015
@@ -115,27 +115,28 @@ APR_DECLARE(apr_status_t) apr_proc_mutex
     int32 stat;
 
     if (atomic_add(&mutex->LockCount, 1) > 0) {
-        int flag = 0;
-#ifdef B_ABSOLUTE_TIMEOUT
-        if (timeout) {
-            flag = absolute ? B_ABSOLUTE_TIMEOUT : B_RELATIVE_TIMEOUT;
+        if (timeout < 0) {
+            stat = acquire_sem(mutex->Lock);
         }
-        stat = acquire_sem_etc(mutex->Lock, 1, flag, timeout);
-#else
-        if (absolute) {
-            apr_time_t now = apr_time_now();
-            if (timeout > now) {
-                timeout -= now;
+        else {
+            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;
+                }
             }
-            else {
-                timeout = 0;
-            }
-        }
-        if (timeout) {
-            flag = B_RELATIVE_TIMEOUT;
+            stat = acquire_sem_etc(mutex->Lock, 1, flag, timeout);
         }
-        stat = acquire_sem_etc(mutex->Lock, 1, flag, timeout);
-#endif
         if (stat < B_NO_ERROR) {
             atomic_add(&mutex->LockCount, -1);
             if (stat == B_TIMED_OUT) {

Modified: apr/apr/trunk/locks/beos/thread_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/locks/beos/thread_mutex.c?rev=1667962&r1=1667961&r2=1667962&view=diff
==============================================================================
--- apr/apr/trunk/locks/beos/thread_mutex.c (original)
+++ apr/apr/trunk/locks/beos/thread_mutex.c Fri Mar 20 09:16:56 2015
@@ -116,8 +116,7 @@ APR_DECLARE(apr_status_t) apr_thread_mut
     }
     
     if (atomic_add(&mutex->LockCount, 1) > 0) {
-        if ((stat = acquire_sem_etc(mutex->Lock, 1,
-                                    B_TIMEOUT, 0)) < B_NO_ERROR) {
+        if ((stat = acquire_sem_etc(mutex->Lock, 1, 0, 0)) < B_NO_ERROR) {
             atomic_add(&mutex->LockCount, -1);
             if (stat == B_WOULD_BLOCK) {
                 stat = APR_EBUSY;
@@ -145,24 +144,29 @@ APR_DECLARE(apr_status_t) apr_thread_mut
     }
     
     if (atomic_add(&mutex->LockCount, 1) > 0) {
-#ifdef B_ABSOLUTE_TIMEOUT
-        stat = acquire_sem_etc(mutex->Lock, 1,
-                               absolute ? B_ABSOLUTE_TIMEOUT
-                                        : B_RELATIVE_TIMEOUT,
-                               timeout);
-#else
-        if (absolute) {
-            apr_time_t now = apr_time_now();
-            if (timeout > now) {
-                timeout -= now;
-            }
-            else {
-                timeout = 0;
+        if (timeout < 0) {
+            stat = acquire_sem(mutex->Lock);
+        }
+        else {
+            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);
         }
-        stat = acquire_sem_etc(mutex->Lock, 1, B_TIMEOUT, timeout);
-#endif
-        if (stat  < B_NO_ERROR) {
+        if (stat < B_NO_ERROR) {
             atomic_add(&mutex->LockCount, -1);
             if (stat == B_TIMED_OUT) {
                 stat = APR_TIMEUP;

Modified: apr/apr/trunk/locks/netware/thread_cond.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/locks/netware/thread_cond.c?rev=1667962&r1=1667961&r2=1667962&view=diff
==============================================================================
--- apr/apr/trunk/locks/netware/thread_cond.c (original)
+++ apr/apr/trunk/locks/netware/thread_cond.c Fri Mar 20 09:16:56 2015
@@ -66,10 +66,21 @@ APR_DECLARE(apr_status_t) apr_thread_con
 
 APR_DECLARE(apr_status_t) apr_thread_cond_timedwait(apr_thread_cond_t *cond,
                                                     apr_thread_mutex_t *mutex,
-                                                    apr_interval_time_t timeout){
-    if (NXCondTimedWait(cond->cond, mutex->mutex, 
-        (timeout*1000)/NXGetSystemTick()) == NX_ETIMEDOUT) {
-        return APR_TIMEUP;
+                                                    apr_interval_time_t timeout)
+{
+    int rc;
+    if (timeout < 0) {
+        rc = NXCondWait(cond->cond, mutex->mutex);
+    }
+    else {
+        timeout = timeout * 1000 / XGetSystemTick();
+        rc = NXCondTimedWait(cond->cond, mutex->mutex, timeout);
+        if (rc == NX_ETIMEDOUT) {
+            return APR_TIMEUP;
+        }
+    }
+    if (rc != 0) {
+        return APR_EINTR;
     }
     return APR_SUCCESS;
 }

Modified: apr/apr/trunk/locks/netware/thread_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/locks/netware/thread_mutex.c?rev=1667962&r1=1667961&r2=1667962&view=diff
==============================================================================
--- apr/apr/trunk/locks/netware/thread_mutex.c (original)
+++ apr/apr/trunk/locks/netware/thread_mutex.c Fri Mar 20 09:16:56 2015
@@ -119,17 +119,22 @@ APR_DECLARE(apr_status_t) apr_thread_mut
         apr_status_t rv;
         NXLock(mutex->mutex);
         if (mutex->locked) {
-            if (absolute) {
-                apr_time_t now = apr_time_now();
-                if (timeout > now) {
-                    timeout -= now;
-                }
-                else {
-                    timeout = 0;
+            mutex->num_waiters++;
+            if (timeout < 0) {
+                rv = apr_thread_cond_dwait(mutex->cond, mutex);
+            }
+            else {
+                if (absolute) {
+                    apr_time_t now = apr_time_now();
+                    if (timeout > now) {
+                        timeout -= now;
+                    }
+                    else {
+                        timeout = 0;
+                    }
                 }
+                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 {

Modified: apr/apr/trunk/locks/os2/proc_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/locks/os2/proc_mutex.c?rev=1667962&r1=1667961&r2=1667962&view=diff
==============================================================================
--- apr/apr/trunk/locks/os2/proc_mutex.c (original)
+++ apr/apr/trunk/locks/os2/proc_mutex.c Fri Mar 20 09:16:56 2015
@@ -162,19 +162,24 @@ APR_DECLARE(apr_status_t) apr_proc_mutex
 {
     ULONG rc;
     
-    if (absolute) {
-        apr_time_t now = apr_time_now();
-        if (timeout > now) {
-            timeout -= now;
-        }
-        else {
-            timeout = 0;
-        }
+    if (timeout < 0) {
+        rc = DosRequestMutexSem(mutex->hMutex, SEM_INDEFINITE_WAIT);
     }
+    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;
+        rc = DosRequestMutexSem(mutex->hMutex, apr_time_as_msec(timeout));
+        if (rc == ERROR_TIMEOUT) {
+            return APR_TIMEUP;
+        }
     }
 
     if (rc == 0) {

Modified: apr/apr/trunk/locks/os2/thread_cond.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/locks/os2/thread_cond.c?rev=1667962&r1=1667961&r2=1667962&view=diff
==============================================================================
--- apr/apr/trunk/locks/os2/thread_cond.c (original)
+++ apr/apr/trunk/locks/os2/thread_cond.c Fri Mar 20 09:16:56 2015
@@ -131,7 +131,8 @@ APR_DECLARE(apr_status_t) apr_thread_con
                                                     apr_thread_mutex_t *mutex,
                                                     apr_interval_time_t timeout)
 {
-    ULONG timeout_ms = apr_time_as_msec(timeout);
+    ULONG timeout_ms = (timeout >= 0) ? apr_time_as_msec(timeout)
+                                      : SEM_INDEFINITE_WAIT;
     return thread_cond_timedwait(cond, mutex, timeout_ms);
 }
 

Modified: apr/apr/trunk/locks/os2/thread_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/locks/os2/thread_mutex.c?rev=1667962&r1=1667961&r2=1667962&view=diff
==============================================================================
--- apr/apr/trunk/locks/os2/thread_mutex.c (original)
+++ apr/apr/trunk/locks/os2/thread_mutex.c Fri Mar 20 09:16:56 2015
@@ -82,21 +82,25 @@ APR_DECLARE(apr_status_t) apr_thread_mut
 {
     ULONG rc;
 
-    if (absolute) {
-        apr_time_t now = apr_time_now();
-        if (timeout > now) {
-            timeout -= now;
+    if (timeout < 0) {
+        rc = DosRequestMutexSem(mutex->hMutex, SEM_INDEFINITE_WAIT);
+    }
+    else {
+        if (absolute) {
+            apr_time_t now = apr_time_now();
+            if (timeout > now) {
+                timeout -= now;
+            }
+            else {
+                timeout = 0;
+            }
         }
-        else {
-            timeout = 0;
+        rc = DosRequestMutexSem(mutex->hMutex, apr_time_as_msec(usec));
+        if (rc == ERROR_TIMEOUT) {
+            return APR_TIMEUP;
         }
     }
 
-    rc = DosRequestMutexSem(mutex->hMutex, apr_time_as_msec(usec));
-    if (rc == ERROR_TIMEOUT) {
-        return APR_TIMEUP;
-    }
-
     return APR_FROM_OS_ERROR(rc);
 }
 

Modified: apr/apr/trunk/locks/unix/global_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/locks/unix/global_mutex.c?rev=1667962&r1=1667961&r2=1667962&view=diff
==============================================================================
--- apr/apr/trunk/locks/unix/global_mutex.c (original)
+++ apr/apr/trunk/locks/unix/global_mutex.c Fri Mar 20 09:16:56 2015
@@ -147,7 +147,7 @@ APR_DECLARE(apr_status_t) apr_global_mut
 {
     apr_status_t rv;
 
-    if (!absolute) {
+    if (timeout >= 0 && !absolute) {
         timeout += apr_time_now();
     }
 

Modified: apr/apr/trunk/locks/unix/proc_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/locks/unix/proc_mutex.c?rev=1667962&r1=1667961&r2=1667962&view=diff
==============================================================================
--- apr/apr/trunk/locks/unix/proc_mutex.c (original)
+++ apr/apr/trunk/locks/unix/proc_mutex.c Fri Mar 20 09:16:56 2015
@@ -179,19 +179,28 @@ static apr_status_t proc_mutex_posix_tim
                                                   int absolute)
 {
 #if HAVE_SEM_TIMEDWAIT
-    struct timespec abstime;
-
-    if (!absolute) {
-        timeout += apr_time_now();
+    if (timeout < 0) {
+        return proc_mutex_posix_acquire(mutex);
     }
-    abstime.tv_sec = apr_time_sec(timeout);
-    abstime.tv_nsec = apr_time_usec(timeout) * 1000; /* nanoseconds */
+    else {
+        int rc;
+        struct timespec abstime;
 
-    if (sem_timedwait(mutex->psem_interproc, &abstime) < 0) {
-        if (errno == ETIMEDOUT) {
-            return APR_TIMEUP;
+        if (!absolute) {
+            timeout += apr_time_now();
+        }
+        abstime.tv_sec = apr_time_sec(timeout);
+        abstime.tv_nsec = apr_time_usec(timeout) * 1000; /* nanoseconds */
+        
+        do {
+            rc = sem_timedwait(mutex->psem_interproc, &abstime);
+        } while (rc < 0 && errno == EINTR);
+        if (rc < 0) {
+            if (errno == ETIMEDOUT) {
+                return APR_TIMEUP;
+            }
+            return errno;
         }
-        return errno;
     }
     mutex->curr_locked = 1;
     return APR_SUCCESS;
@@ -325,24 +334,27 @@ static apr_status_t proc_mutex_sysv_time
                                                  int absolute)
 {
 #if HAVE_SEMTIMEDOP
-    int rc;
-    struct timespec abstime;
-
-    if (!absolute) {
-        timeout += apr_time_now();
+    if (timeout < 0) {
+        return proc_mutex_sysv_acquire(mutex);
     }
-    abstime.tv_sec = apr_time_sec(timeout);
-    abstime.tv_nsec = apr_time_usec(timeout) * 1000; /* nanoseconds */
-
-    do {
-        rc = semtimedop(mutex->interproc->filedes, &proc_mutex_op_on, 1,
-                        &abstime);
-    } while (rc < 0 && errno == EINTR);
-    if (rc < 0) {
-        if (errno == EAGAIN) {
-            return APR_TIMEUP;
+    else {
+        int rc;
+        struct timespec abstime;
+        if (!absolute) {
+            timeout += apr_time_now();
+        }
+        abstime.tv_sec = apr_time_sec(timeout);
+        abstime.tv_nsec = apr_time_usec(timeout) * 1000; /* nanoseconds */
+        do {
+            rc = semtimedop(mutex->interproc->filedes, &proc_mutex_op_on, 1,
+                            &abstime);
+        } while (rc < 0 && errno == EINTR);
+        if (rc < 0) {
+            if (errno == EAGAIN) {
+                return APR_TIMEUP;
+            }
+            return errno;
         }
-        return errno;
     }
     mutex->curr_locked = 1;
     return APR_SUCCESS;
@@ -567,7 +579,7 @@ static apr_status_t proc_mutex_proc_pthr
 #endif
     }
     mutex->curr_locked = 1;
-    return rv;
+    return APR_SUCCESS;
 }
 
 static apr_status_t
@@ -575,36 +587,42 @@ proc_mutex_proc_pthread_timedacquire(apr
                                      apr_time_t timeout,
                                      int absolute)
 {
-    apr_status_t rv;
-    struct timespec abstime;
-
-    if (!absolute) {
-        timeout += apr_time_now();
+    if (timeout < 0) {
+        return proc_mutex_proc_pthread_acquire(mutex);
     }
-    abstime.tv_sec = apr_time_sec(timeout);
-    abstime.tv_nsec = apr_time_usec(timeout) * 1000; /* nanoseconds */
+    else {
+        apr_status_t rv;
+        struct timespec abstime;
 
-    if ((rv = pthread_mutex_timedlock(mutex->pthread_interproc, &abstime))) {
+        if (!absolute) {
+            timeout += apr_time_now();
+        }
+        abstime.tv_sec = apr_time_sec(timeout);
+        abstime.tv_nsec = apr_time_usec(timeout) * 1000; /* nanoseconds */
+
+        if ((rv = pthread_mutex_timedlock(mutex->pthread_interproc,
+                                          &abstime))) {
 #ifdef HAVE_ZOS_PTHREADS 
-        rv = errno;
+            rv = errno;
 #endif
-        if (rv == ETIMEDOUT) {
-            return APR_TIMEUP;
-        }
+            if (rv == ETIMEDOUT) {
+                return APR_TIMEUP;
+            }
 #ifdef HAVE_PTHREAD_MUTEX_ROBUST
-        /* Okay, our owner died.  Let's try to make it consistent again. */
-        if (rv == EOWNERDEAD) {
-            pthread_mutex_consistent_np(mutex->pthread_interproc);
-            rv = APR_SUCCESS;
-        }
-        else
-            return rv;
+            /* Okay, our owner died.  Let's try to make it consistent again. */
+            if (rv == EOWNERDEAD) {
+                pthread_mutex_consistent_np(mutex->pthread_interproc);
+                rv = APR_SUCCESS;
+            }
+            else
+                return rv;
 #else
-        return rv;
+            return rv;
 #endif
+        }
     }
     mutex->curr_locked = 1;
-    return rv;
+    return APR_SUCCESS;
 }
 
 static apr_status_t proc_mutex_proc_pthread_release(apr_proc_mutex_t *mutex)

Modified: apr/apr/trunk/locks/unix/thread_cond.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/locks/unix/thread_cond.c?rev=1667962&r1=1667961&r2=1667962&view=diff
==============================================================================
--- apr/apr/trunk/locks/unix/thread_cond.c (original)
+++ apr/apr/trunk/locks/unix/thread_cond.c Fri Mar 20 09:16:56 2015
@@ -79,21 +79,31 @@ APR_DECLARE(apr_status_t) apr_thread_con
                                                     apr_interval_time_t timeout)
 {
     apr_status_t rv;
-    apr_time_t then;
-    struct timespec abstime;
+    if (timeout < 0) {
+        rv = pthread_cond_wait(&cond->cond, &mutex->mutex);
+#ifdef HAVE_ZOS_PTHREADS
+        if (rv) {
+            rv = errno;
+        }
+#endif
+    }
+    else {
+        apr_time_t then;
+        struct timespec abstime;
 
-    then = apr_time_now() + timeout;
-    abstime.tv_sec = apr_time_sec(then);
-    abstime.tv_nsec = apr_time_usec(then) * 1000; /* nanoseconds */
+        then = apr_time_now() + timeout;
+        abstime.tv_sec = apr_time_sec(then);
+        abstime.tv_nsec = apr_time_usec(then) * 1000; /* nanoseconds */
 
-    rv = pthread_cond_timedwait(&cond->cond, &mutex->mutex, &abstime);
+        rv = pthread_cond_timedwait(&cond->cond, &mutex->mutex, &abstime);
 #ifdef HAVE_ZOS_PTHREADS
-    if (rv) {
-        rv = errno;
-    }
+        if (rv) {
+            rv = errno;
+        }
 #endif
-    if (ETIMEDOUT == rv) {
-        return APR_TIMEUP;
+        if (ETIMEDOUT == rv) {
+            return APR_TIMEUP;
+        }
     }
     return rv;
 }

Modified: apr/apr/trunk/locks/unix/thread_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/locks/unix/thread_mutex.c?rev=1667962&r1=1667961&r2=1667962&view=diff
==============================================================================
--- apr/apr/trunk/locks/unix/thread_mutex.c (original)
+++ apr/apr/trunk/locks/unix/thread_mutex.c Fri Mar 20 09:16:56 2015
@@ -196,21 +196,31 @@ APR_DECLARE(apr_status_t) apr_thread_mut
     apr_status_t rv = APR_ENOTIMPL;
 
 #ifdef HAVE_PTHREAD_MUTEX_TIMEDLOCK
-    struct timespec abstime;
-
-    if (!absolute) {
-        timeout += apr_time_now();
+    if (timeout < 0) {
+        rv = pthread_mutex_lock(&mutex->mutex);
+        if (rv) {
+#ifdef HAVE_ZOS_PTHREADS
+            rv = errno;
+#endif
+        }
     }
-    abstime.tv_sec = apr_time_sec(timeout);
-    abstime.tv_nsec = apr_time_usec(timeout) * 1000; /* nanoseconds */
+    else {
+        struct timespec abstime;
+
+        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(&mutex->mutex, &abstime);
-    if (rv) {
+        rv = pthread_mutex_timedlock(&mutex->mutex, &abstime);
+        if (rv) {
 #ifdef HAVE_ZOS_PTHREADS
-        rv = errno;
+            rv = errno;
 #endif
-        if (rv == ETIMEDOUT) {
-            rv = APR_TIMEUP;
+            if (rv == ETIMEDOUT) {
+                rv = APR_TIMEUP;
+            }
         }
     }
 
@@ -228,17 +238,22 @@ APR_DECLARE(apr_status_t) apr_thread_mut
         }
 
         if (mutex->locked) {
-            if (absolute) {
-                apr_time_t now = apr_time_now();
-                if (timeout > now) {
-                    timeout -= now;
-                }
-                else {
-                    timeout = 0;
+            mutex->num_waiters++;
+            if (timeout < 0) {
+                rv = apr_thread_cond_wait(mutex->cond, mutex);
+            }
+            else {
+                if (absolute) {
+                    apr_time_t now = apr_time_now();
+                    if (timeout > now) {
+                        timeout -= now;
+                    }
+                    else {
+                        timeout = 0;
+                    }
                 }
+                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 {

Modified: apr/apr/trunk/locks/win32/proc_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/locks/win32/proc_mutex.c?rev=1667962&r1=1667961&r2=1667962&view=diff
==============================================================================
--- apr/apr/trunk/locks/win32/proc_mutex.c (original)
+++ apr/apr/trunk/locks/win32/proc_mutex.c Fri Mar 20 09:16:56 2015
@@ -166,24 +166,28 @@ APR_DECLARE(apr_status_t) apr_proc_mutex
 {
     DWORD rv;
 
-    if (absolute) {
-        apr_time_t now = apr_time_now();
-        if (timeout > now) {
-            timeout -= now;
+    if (timeout < 0) {
+        rv = WaitForSingleObject(mutex->handle, INFINITE);
+    }
+    else {
+        if (absolute) {
+            apr_time_t now = apr_time_now();
+            if (timeout > now) {
+                timeout -= now;
+            }
+            else {
+                timeout = 0;
+            }
         }
-        else {
-            timeout = 0;
+        rv = WaitForSingleObject(mutex->handle, apr_time_as_msec(timeout));
+        if (rv == WAIT_TIMEOUT) {
+            return APR_TIMEUP;
         }
     }
 
-    rv = WaitForSingleObject(mutex->handle, apr_time_as_msec(timeout));
-
     if (rv == WAIT_OBJECT_0 || rv == WAIT_ABANDONED) {
         return APR_SUCCESS;
     } 
-    else if (rv == WAIT_TIMEOUT) {
-        return APR_TIMEUP;
-    }
     return apr_get_os_error();
 }
 

Modified: apr/apr/trunk/locks/win32/thread_cond.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/locks/win32/thread_cond.c?rev=1667962&r1=1667961&r2=1667962&view=diff
==============================================================================
--- apr/apr/trunk/locks/win32/thread_cond.c (original)
+++ apr/apr/trunk/locks/win32/thread_cond.c Fri Mar 20 09:16:56 2015
@@ -61,9 +61,9 @@ APR_DECLARE(apr_status_t) apr_thread_con
     return apr_pool_cleanup_run(cond->pool, cond, thread_cond_cleanup);
 }
 
-static APR_INLINE apr_status_t _thread_cond_timedwait(apr_thread_cond_t *cond,
-                                                      apr_thread_mutex_t *mutex,
-                                                      DWORD timeout_ms )
+static APR_INLINE apr_status_t thread_cond_timedwait(apr_thread_cond_t *cond,
+                                                     apr_thread_mutex_t *mutex,
+                                                     DWORD timeout_ms )
 {
     DWORD res;
     apr_status_t rv;
@@ -115,16 +115,15 @@ static APR_INLINE apr_status_t _thread_c
 APR_DECLARE(apr_status_t) apr_thread_cond_wait(apr_thread_cond_t *cond,
                                                apr_thread_mutex_t *mutex)
 {
-    return _thread_cond_timedwait(cond, mutex, INFINITE);
+    return thread_cond_timedwait(cond, mutex, INFINITE);
 }
 
 APR_DECLARE(apr_status_t) apr_thread_cond_timedwait(apr_thread_cond_t *cond,
                                                     apr_thread_mutex_t *mutex,
                                                     apr_interval_time_t timeout)
 {
-    DWORD timeout_ms = (DWORD) apr_time_as_msec(timeout);
-
-    return _thread_cond_timedwait(cond, mutex, timeout_ms);
+    DWORD timeout_ms = (timeout >= 0) ? apr_time_as_msec(timeout) : INFINITE;
+    return thread_cond_timedwait(cond, mutex, timeout_ms);
 }
 
 APR_DECLARE(apr_status_t) apr_thread_cond_signal(apr_thread_cond_t *cond)

Modified: apr/apr/trunk/locks/win32/thread_mutex.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/locks/win32/thread_mutex.c?rev=1667962&r1=1667961&r2=1667962&view=diff
==============================================================================
--- apr/apr/trunk/locks/win32/thread_mutex.c (original)
+++ apr/apr/trunk/locks/win32/thread_mutex.c Fri Mar 20 09:16:56 2015
@@ -119,19 +119,25 @@ APR_DECLARE(apr_status_t) apr_thread_mut
                                                      int absolute)
 {
     if (mutex->type != thread_mutex_critical_section) {
-        DWORD rv;
-        if (absolute) {
-            apr_time_t now = apr_time_now();
-            if (timeout > now) {
-                timeout -= now;
-            }
-            else {
-                timeout = 0;
+        DWORD rv, timeout_ms;
+        if (timeout < 0) {
+            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, apr_time_as_msec(timeout));
+        rv = WaitForSingleObject(mutex->handle, timeout_ms);
         if ((rv != WAIT_OBJECT_0) && (rv != WAIT_ABANDONED)) {
-            return (rv == WAIT_TIMEOUT) ? APR_EBUSY : apr_get_os_error();
+            return (rv == WAIT_TIMEOUT) ? APR_TIMEUP : apr_get_os_error();
         }
         return APR_SUCCESS;
     }