summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--CHANGES6
-rw-r--r--os/win32/util_win32.c16
-rw-r--r--server/mpm/winnt/child.c3
3 files changed, 19 insertions, 6 deletions
diff --git a/CHANGES b/CHANGES
index 5f5da5276f..1e0ed28552 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 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;