mpm_winnt: Avoid using TerminateThread() in case the shutdown routine hits a timeout while waiting for the worker threads to exit.
Using TerminateThread() can have dangerous consequences such as deadlocks — say, if the the thread is terminated while holding a lock or a heap lock in the middle of HeapAlloc(), as these locks would not be released. Or it can corrupt the application state and cause a crash.
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.