From: Evgeny Kotkov Date: Tue, 11 Jul 2017 16:41:51 +0000 (+0000) Subject: mpm_winnt: Make the shutdown faster by avoiding unnecessary Sleep()'s X-Git-Tag: 2.5.0-alpha~295 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=180026b4f4605facb3e46e56aa31e9e088a02631;p=thirdparty%2Fapache%2Fhttpd.git mpm_winnt: Make the shutdown faster by avoiding unnecessary Sleep()'s 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 --- diff --git a/server/mpm/winnt/child.c b/server/mpm/winnt/child.c index 375391e6eed..16407e6bca1 100644 --- a/server/mpm/winnt/child.c +++ b/server/mpm/winnt/child.c @@ -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) {