]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
mpm_winnt: Make the shutdown faster by avoiding unnecessary Sleep()'s
authorEvgeny Kotkov <kotkov@apache.org>
Tue, 11 Jul 2017 16:41:51 +0000 (16:41 +0000)
committerEvgeny Kotkov <kotkov@apache.org>
Tue, 11 Jul 2017 16:41:51 +0000 (16:41 +0000)
when shutting down the worker threads.

Previously, the shutdown code was posting an amount of I/O completion
packets equal to the amount of the threads blocked on the I/O completion
port.  Then it would Sleep() until all these threads "acknowledge" the
completion packets by decrementing the global amount of blocked threads.

A better way would be to send the number of IOCP_SHUTDOWN completion
packets equal to the total amount of threads and immediately proceed to
the next step.  There is no need to block until the threads actually receive
the completion, as the shutdown process includes a separate step that waits
until the threads exit, and the new approach avoids an unnecessary delay.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1801635 13f79535-47bb-0310-9956-ffa450edef68

server/mpm/winnt/child.c

index 375391e6eed47b72df35b6162a0c2142f5d6793b..16407e6bca1d7aa8462e61e2deeba5e4d4ddc1c1 100644 (file)
@@ -1173,19 +1173,19 @@ void child_main(apr_pool_t *pconf, DWORD parent_pid)
                      "Child: Failure releasing the start mutex");
     }
 
-    /* Shutdown the worker threads
-     * Post worker threads blocked on the ThreadDispatch IOCompletion port
+    /* Shutdown the worker threads by posting a number of IOCP_SHUTDOWN
+     * completion packets equal to the amount of created threads
      */
-    while (g_blocked_threads > 0) {
+    if (g_blocked_threads > 0) {
         ap_log_error(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS, ap_server_conf, APLOGNO(00361)
                      "Child: %d threads blocked on the completion port",
                      g_blocked_threads);
-        for (i=g_blocked_threads; i > 0; i--) {
-            PostQueuedCompletionStatus(ThreadDispatchIOCP, 0,
-                                       IOCP_SHUTDOWN, NULL);
-        }
-        Sleep(1000);
     }
+
+    for (i = 0; i < threads_created; i++) {
+        PostQueuedCompletionStatus(ThreadDispatchIOCP, 0, IOCP_SHUTDOWN, NULL);
+    }
+
     /* Empty the accept queue of completion contexts */
     apr_thread_mutex_lock(qlock);
     while (qhead) {