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 2005/07/22 23:51:26 UTC

svn commit: r224408 - in /apr/apr/branches/0.9.x: CHANGES include/arch/win32/apr_arch_thread_cond.h locks/win32/thread_cond.c

Author: wrowe
Date: Fri Jul 22 14:51:21 2005
New Revision: 224408

URL: http://svn.apache.org/viewcvs?rev=224408&view=rev
Log:
Refactor Win32 condition variables code to address bugs.

PR: 27654, 34336
Submitted by: Henry Jen <henryjen ztune.net> and E Holyat <eholyat yahoo.com>
Reviewed by: wrowe, stoddard
Backport: 224407

Modified:
    apr/apr/branches/0.9.x/CHANGES
    apr/apr/branches/0.9.x/include/arch/win32/apr_arch_thread_cond.h
    apr/apr/branches/0.9.x/locks/win32/thread_cond.c

Modified: apr/apr/branches/0.9.x/CHANGES
URL: http://svn.apache.org/viewcvs/apr/apr/branches/0.9.x/CHANGES?rev=224408&r1=224407&r2=224408&view=diff
==============================================================================
--- apr/apr/branches/0.9.x/CHANGES (original)
+++ apr/apr/branches/0.9.x/CHANGES Fri Jul 22 14:51:21 2005
@@ -1,5 +1,8 @@
 Changes with APR 0.9.7
 
+  *) Refactor Win32 condition variables code to address bugs 27654, 34336.
+     [Henry Jen <henryjen ztune.net>, E Holyat <eholyat yahoo.com>]
+
   *) Support APR_SO_SNDBUF and APR_SO_RCVBUF on Windows.  PR 32177.
      [Sim <sgobbi datamanagement.it>, Jeff Trawick]
 

Modified: apr/apr/branches/0.9.x/include/arch/win32/apr_arch_thread_cond.h
URL: http://svn.apache.org/viewcvs/apr/apr/branches/0.9.x/include/arch/win32/apr_arch_thread_cond.h?rev=224408&r1=224407&r2=224408&view=diff
==============================================================================
--- apr/apr/branches/0.9.x/include/arch/win32/apr_arch_thread_cond.h (original)
+++ apr/apr/branches/0.9.x/include/arch/win32/apr_arch_thread_cond.h Fri Jul 22 14:51:21 2005
@@ -22,7 +22,6 @@
 struct apr_thread_cond_t {
     apr_pool_t *pool;
     HANDLE event;
-    HANDLE mutex;
     int signal_all;
     int num_waiting;
     int signalled;

Modified: apr/apr/branches/0.9.x/locks/win32/thread_cond.c
URL: http://svn.apache.org/viewcvs/apr/apr/branches/0.9.x/locks/win32/thread_cond.c?rev=224408&r1=224407&r2=224408&view=diff
==============================================================================
--- apr/apr/branches/0.9.x/locks/win32/thread_cond.c (original)
+++ apr/apr/branches/0.9.x/locks/win32/thread_cond.c Fri Jul 22 14:51:21 2005
@@ -25,7 +25,6 @@
 static apr_status_t thread_cond_cleanup(void *data)
 {
     apr_thread_cond_t *cond = data;
-    CloseHandle(cond->mutex);
     CloseHandle(cond->event);
     return APR_SUCCESS;
 }
@@ -36,95 +35,61 @@
     *cond = apr_palloc(pool, sizeof(**cond));
     (*cond)->pool = pool;
     (*cond)->event = CreateEvent(NULL, TRUE, FALSE, NULL);
-    (*cond)->mutex = CreateMutex(NULL, FALSE, NULL);
     (*cond)->signal_all = 0;
     (*cond)->num_waiting = 0;
     return APR_SUCCESS;
 }
 
-APR_DECLARE(apr_status_t) apr_thread_cond_wait(apr_thread_cond_t *cond,
-                                               apr_thread_mutex_t *mutex)
+static APR_INLINE apr_status_t _thread_cond_timedwait(apr_thread_cond_t *cond,
+                                                      apr_thread_mutex_t *mutex,
+                                                      DWORD timeout_ms )
 {
     DWORD res;
 
     while (1) {
-        res = WaitForSingleObject(cond->mutex, INFINITE);
-        if (res != WAIT_OBJECT_0) {
-            return apr_get_os_error();
-        }
         cond->num_waiting++;
-        ReleaseMutex(cond->mutex);
 
         apr_thread_mutex_unlock(mutex);
-        res = WaitForSingleObject(cond->event, INFINITE);
+        res = WaitForSingleObject(cond->event, timeout_ms);
+        apr_thread_mutex_lock(mutex);
         cond->num_waiting--;
         if (res != WAIT_OBJECT_0) {
             apr_status_t rv = apr_get_os_error();
-            ReleaseMutex(cond->mutex);
-            return rv;
+            if (res == WAIT_TIMEOUT) {
+                return APR_TIMEUP;
+            }
+            return apr_get_os_error();
         }
         if (cond->signal_all) {
             if (cond->num_waiting == 0) {
+                cond->signal_all = 0;
+                cond->signalled = 0;
                 ResetEvent(cond->event);
             }
             break;
         }
-        if (cond->signalled) {
+        else if (cond->signalled) {
             cond->signalled = 0;
             ResetEvent(cond->event);
             break;
         }
-        ReleaseMutex(cond->mutex);
     }
-    apr_thread_mutex_lock(mutex);
     return APR_SUCCESS;
 }
 
+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);
+}
+
 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 res;
     DWORD timeout_ms = (DWORD) apr_time_as_msec(timeout);
 
-    while (1) {
-        res = WaitForSingleObject(cond->mutex, timeout_ms);
-        if (res != WAIT_OBJECT_0) {
-            if (res == WAIT_TIMEOUT) {
-                return APR_TIMEUP;
-            }
-            return apr_get_os_error();
-        }
-        cond->num_waiting++;
-        ReleaseMutex(cond->mutex);
-
-        apr_thread_mutex_unlock(mutex);
-        res = WaitForSingleObject(cond->event, timeout_ms);
-        cond->num_waiting--;
-        if (res != WAIT_OBJECT_0) {
-            apr_status_t rv = apr_get_os_error();
-            ReleaseMutex(cond->mutex);
-            apr_thread_mutex_lock(mutex);
-            if (res == WAIT_TIMEOUT) {
-                return APR_TIMEUP;
-            }
-            return apr_get_os_error();
-        }
-        if (cond->signal_all) {
-            if (cond->num_waiting == 0) {
-                ResetEvent(cond->event);
-            }
-            break;
-        }
-        if (cond->signalled) {
-            cond->signalled = 0;
-            ResetEvent(cond->event);
-            break;
-        }
-        ReleaseMutex(cond->mutex);
-    }
-    apr_thread_mutex_lock(mutex);
-    return APR_SUCCESS;
+    return _thread_cond_timedwait(cond, mutex, timeout_ms);
 }
 
 APR_DECLARE(apr_status_t) apr_thread_cond_signal(apr_thread_cond_t *cond)
@@ -132,16 +97,11 @@
     apr_status_t rv = APR_SUCCESS;
     DWORD res;
 
-    res = WaitForSingleObject(cond->mutex, INFINITE);
-    if (res != WAIT_OBJECT_0) {
-        return apr_get_os_error();
-    }
     cond->signalled = 1;
     res = SetEvent(cond->event);
     if (res == 0) {
         rv = apr_get_os_error();
     }
-    ReleaseMutex(cond->mutex);
     return rv;
 }
 
@@ -150,17 +110,12 @@
     apr_status_t rv = APR_SUCCESS;
     DWORD res;
 
-    res = WaitForSingleObject(cond->mutex, INFINITE);
-    if (res != WAIT_OBJECT_0) {
-        return apr_get_os_error();
-    }
     cond->signalled = 1;
     cond->signal_all = 1;
     res = SetEvent(cond->event);
     if (res == 0) {
         rv = apr_get_os_error();
     }
-    ReleaseMutex(cond->mutex);
     return rv;
 }