Commit ef1cd20d authored by Jeff Trawick's avatar Jeff Trawick
Browse files

WinNT MPM: Improve robustness under heavy load.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1090621 13f79535-47bb-0310-9956-ffa450edef68
parent cf0a3747
Loading
Loading
Loading
Loading
+2 −0
Changes for CHANGES: 2 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -2,6 +2,8 @@

Changes with Apache 2.3.12

  *) WinNT MPM: Improve robustness under heavy load.  [Jeff Trawick]

  *) MinGW build improvements.  PR 49535.  [John Vandenberg 
     <jayvdb gmail.com>, Jeff Trawick]

+8 −2
Changes for server/mpm/winnt/child.c: 8 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -137,11 +137,12 @@ static void mpm_recycle_completion_context(winnt_conn_ctx_t *context)
    }
}

static winnt_conn_ctx_t *mpm_get_completion_context(void)
static winnt_conn_ctx_t *mpm_get_completion_context(int *timeout)
{
    apr_status_t rv;
    winnt_conn_ctx_t *context = NULL;

    *timeout = 0;
    while (1) {
        /* Grab a context off the queue */
        apr_thread_mutex_lock(qlock);
@@ -186,6 +187,7 @@ static winnt_conn_ctx_t *mpm_get_completion_context(void)
                        ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf,
                                     "mpm_get_completion_context: Failed to get a "
                                     "free context within 1 second");
                        *timeout = 1;
                    }
                    else {
                        /* should be the unexpected, generic WAIT_FAILED */
@@ -358,8 +360,11 @@ reinit: /* target of data or connect upon too many AcceptEx failures */

    while (!shutdown_in_progress) {
        if (!context) {
            context = mpm_get_completion_context();
            int timeout;

            context = mpm_get_completion_context(&timeout);
            if (!context) {
                if (!timeout) {
                    /* Hopefully a temporary condition in the provider? */
                    ++err_count;
                    if (err_count > MAX_ACCEPTEX_ERR_COUNT) {
@@ -368,6 +373,7 @@ reinit: /* target of data or connect upon too many AcceptEx failures */
                                     "connection ctx.  Aborting.");
                        break;
                    }
                }
                Sleep(100);
                continue;
            }