From commits-return-6909-apmail-apr-commits-archive=apr.apache.org@apr.apache.org Sun Aug 14 00:43:12 2005 Return-Path: Delivered-To: apmail-apr-commits-archive@www.apache.org Received: (qmail 8689 invoked from network); 14 Aug 2005 00:43:12 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 14 Aug 2005 00:43:12 -0000 Received: (qmail 14201 invoked by uid 500); 14 Aug 2005 00:43:11 -0000 Delivered-To: apmail-apr-commits-archive@apr.apache.org Received: (qmail 14173 invoked by uid 500); 14 Aug 2005 00:43:11 -0000 Mailing-List: contact commits-help@apr.apache.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: Reply-To: dev@apr.apache.org List-Id: Delivered-To: mailing list commits@apr.apache.org Received: (qmail 14160 invoked by uid 99); 14 Aug 2005 00:43:11 -0000 X-ASF-Spam-Status: No, hits=-9.8 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Sat, 13 Aug 2005 17:43:10 -0700 Received: (qmail 8675 invoked by uid 65534); 14 Aug 2005 00:43:10 -0000 Message-ID: <20050814004310.8674.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r232553 - in /apr/apr/branches/1.2.x: CHANGES include/arch/win32/apr_arch_thread_cond.h locks/win32/thread_cond.c Date: Sun, 14 Aug 2005 00:43:09 -0000 To: commits@apr.apache.org From: pquerna@apache.org X-Mailer: svnmailer-1.0.3 X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: pquerna Date: Sat Aug 13 17:43:07 2005 New Revision: 232553 URL: http://svn.apache.org/viewcvs?rev=232553&view=rev Log: Merge r224407 from trunk, fixing Win32 condition variables. Modified: apr/apr/branches/1.2.x/CHANGES apr/apr/branches/1.2.x/include/arch/win32/apr_arch_thread_cond.h apr/apr/branches/1.2.x/locks/win32/thread_cond.c Modified: apr/apr/branches/1.2.x/CHANGES URL: http://svn.apache.org/viewcvs/apr/apr/branches/1.2.x/CHANGES?rev=232553&r1=232552&r2=232553&view=diff ============================================================================== --- apr/apr/branches/1.2.x/CHANGES (original) +++ apr/apr/branches/1.2.x/CHANGES Sat Aug 13 17:43:07 2005 @@ -1,3 +1,8 @@ +Changes for APR 1.2.1 + + *) Refactor Win32 condition variables code to address bugs 27654, 34336. + [Henry Jen , E Holyat ] + Changes for APR 1.2.0 *) If getpwuid_r or getgrgid_r set their results to NULL, it is an error. Modified: apr/apr/branches/1.2.x/include/arch/win32/apr_arch_thread_cond.h URL: http://svn.apache.org/viewcvs/apr/apr/branches/1.2.x/include/arch/win32/apr_arch_thread_cond.h?rev=232553&r1=232552&r2=232553&view=diff ============================================================================== --- apr/apr/branches/1.2.x/include/arch/win32/apr_arch_thread_cond.h (original) +++ apr/apr/branches/1.2.x/include/arch/win32/apr_arch_thread_cond.h Sat Aug 13 17:43:07 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/1.2.x/locks/win32/thread_cond.c URL: http://svn.apache.org/viewcvs/apr/apr/branches/1.2.x/locks/win32/thread_cond.c?rev=232553&r1=232552&r2=232553&view=diff ============================================================================== --- apr/apr/branches/1.2.x/locks/win32/thread_cond.c (original) +++ apr/apr/branches/1.2.x/locks/win32/thread_cond.c Sat Aug 13 17:43:07 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; }