Commit 785e4c3d authored by Mladen Turk's avatar Mladen Turk
Browse files

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
parent a4f8dc9d
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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]
+12 −4
Original line number Diff line number Diff line
@@ -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) {
                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;
}
+1 −2
Original line number Diff line number Diff line
@@ -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;