stoddard 98/09/10 10:38:02
Modified: src/main http_main.c
Log:
Remove NT 64 thread limit.
Submitted by: Ken Parzygnat, Bill Stoddard
Reviewed by: Bill Stoddard
Revision Changes Path
1.389 +43 -3 apache-1.3/src/main/http_main.c
Index: http_main.c
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/main/http_main.c,v
retrieving revision 1.388
retrieving revision 1.389
diff -u -r1.388 -r1.389
--- http_main.c 1998/08/26 20:01:22 1.388
+++ http_main.c 1998/09/10 17:38:00 1.389
@@ -4919,7 +4919,46 @@
handles[i] = handles[i + 1];
(*thread_cnt)--;
}
-
+#ifdef WIN32
+/*
+ * The Win32 call WaitForMultipleObjects will only allow you to wait for
+ * a maximum of MAXIMUM_WAIT_OBJECTS (current 64). Since the threading
+ * model in the multithreaded version of apache wants to use this call,
+ * we are restricted to a maximum of 64 threads. This is a simplistic
+ * routine that will increase this size.
+ */
+DWORD wait_for_many_objects(DWORD nCount, CONST HANDLE *lpHandles,
+ DWORD dwSeconds)
+{
+ time_t tStopTime;
+ DWORD dwRet = WAIT_TIMEOUT;
+ DWORD dwIndex=0;
+ BOOL bFirst = TRUE;
+
+ tStopTime = time(NULL) + dwSeconds;
+
+ do {
+ if (!bFirst)
+ Sleep(1000);
+ else
+ bFirst = FALSE;
+
+ for (dwIndex = 0; dwIndex * MAXIMUM_WAIT_OBJECTS < nCount;
dwIndex++) {
+ dwRet = WaitForMultipleObjects(
+ min(MAXIMUM_WAIT_OBJECTS,
+ nCount - (dwIndex * MAXIMUM_WAIT_OBJECTS)),
+ lpHandles + (dwIndex * MAXIMUM_WAIT_OBJECTS),
+ 0, 0);
+
+ if (dwRet != WAIT_TIMEOUT) {
+ break;
+ }
+ }
+ } while((time(NULL) < tStopTime) && (dwRet == WAIT_TIMEOUT));
+
+ return dwRet;
+}
+#endif
/*****************************************************************
* Executive routines.
*/
@@ -5074,7 +5113,7 @@
/* Lets not break yet - we may have threads to clean up */
/* break;*/
}
- rv = WaitForMultipleObjects(nthreads, child_handles, 0, 0);
+ rv = wait_for_many_objects(nthreads, child_handles, 0);
ap_assert(rv != WAIT_FAILED);
if (rv != WAIT_TIMEOUT) {
rv = rv - WAIT_OBJECT_0;
@@ -5185,7 +5224,8 @@
/* Wait for all your children */
end_time = time(NULL) + 180;
while (nthreads) {
- rv = WaitForMultipleObjects(nthreads, child_handles, 0, (end_time -
time(NULL)) * 1000);
+ rv = wait_for_many_objects(nthreads, child_handles,
+ end_time - time(NULL));
if (rv != WAIT_TIMEOUT) {
rv = rv - WAIT_OBJECT_0;
ap_assert((rv >= 0) && (rv < nthreads));