From: Mladen Turk Date: Wed, 2 Aug 2006 15:31:24 +0000 (+0000) Subject: Fix return values from wait_for_many_objects. X-Git-Tag: 2.3.0~2180 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=36db918bc8d17a23ca013e7dad5e328baf3b2de4;p=thirdparty%2Fapache%2Fhttpd.git Fix return values from wait_for_many_objects. The return value is index to the signaled thread in the creted_threads array. We can not use WAIT_TIMEOUT as return value because its value is defined as 258, thus limiting the MaxThreads to that value that leads to the assertion errors. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@428029 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 5f5da5276f8..1e0ed285528 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,12 @@ Changes with Apache 2.3.0 [Remove entries to the current 2.0 and 2.2 section below, when backported] + *) mpm_winnt: Fix return values from wait_for_many_objects. + The return value is index to the signaled thread in the + creted_threads array. We can not use WAIT_TIMEOUT because + his value is defined as 258, thus limiting the MaxThreads + to that value. [Mladen Turk] + *) mod_proxy_balancer: Workers can now be defined as part of a balancer cluster "set" in which members of a lower-numbered set are preferred over higher numbered ones. [Jim Jagielski] diff --git a/os/win32/util_win32.c b/os/win32/util_win32.c index a0bb7fd7de1..e8ba49c760e 100644 --- a/os/win32/util_win32.c +++ b/os/win32/util_win32.c @@ -158,7 +158,7 @@ DWORD wait_for_many_objects(DWORD nCount, CONST HANDLE *lpHandles, DWORD dwSeconds) { time_t tStopTime; - DWORD dwRet = WAIT_TIMEOUT; + DWORD dwRet = WAIT_FAILED; DWORD dwIndex=0; BOOL bFirst = TRUE; @@ -175,12 +175,20 @@ DWORD wait_for_many_objects(DWORD nCount, CONST HANDLE *lpHandles, min(MAXIMUM_WAIT_OBJECTS, nCount - (dwIndex * MAXIMUM_WAIT_OBJECTS)), lpHandles + (dwIndex * MAXIMUM_WAIT_OBJECTS), 0, 0); - + if (dwRet == WAIT_FAILED) { + return dwRet; + } if (dwRet != WAIT_TIMEOUT) { - break; + if (dwRet >= WAIT_ABANDONED_0) + dwRet = dwRet - WAIT_ABANDONED_0; + else + dwRet = dwRet - WAIT_OBJECT_0; + dwRet = dwRet + (dwIndex * MAXIMUM_WAIT_OBJECTS); + break; } + dwRet = WAIT_FAILED; } - } while((time(NULL) < tStopTime) && (dwRet == WAIT_TIMEOUT)); + } while((time(NULL) < tStopTime) && (dwRet == WAIT_FAILED)); return dwRet; } diff --git a/server/mpm/winnt/child.c b/server/mpm/winnt/child.c index d950869806a..4d832521570 100644 --- a/server/mpm/winnt/child.c +++ b/server/mpm/winnt/child.c @@ -1119,8 +1119,7 @@ void child_main(apr_pool_t *pconf) end_time = time(NULL) + 180; while (threads_created) { rv = wait_for_many_objects(threads_created, child_handles, (DWORD)(end_time - time(NULL))); - if (rv != WAIT_TIMEOUT) { - rv = rv - WAIT_OBJECT_0; + if (rv != WAIT_FAILED) { ap_assert((rv >= 0) && (rv < threads_created)); cleanup_thread(child_handles, &threads_created, rv); continue;