diff options
Diffstat (limited to '')
-rw-r--r-- | CHANGES | 6 | ||||
-rw-r--r-- | os/win32/util_win32.c | 16 | ||||
-rw-r--r-- | server/mpm/winnt/child.c | 3 |
3 files changed, 19 insertions, 6 deletions
@@ -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 a0bb7fd7de..e8ba49c760 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 d950869806..4d83252157 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; |