Hi Vincent,
- /* wait for app to quit on its own for a while */ - ret = WaitForSingleObject( process_handle, PROCQUIT_TIMEOUT ); + /* Check whether the app quit on its own */ + ret = WaitForSingleObject( process_handle, 0 ); CloseHandle( process_handle ); if (ret == WAIT_TIMEOUT)
I'm confused why you removed the timeout. The documented behavior[1, 2] is to wait a short timeout, show a dialog if the app hasn't quit by then, then kill it. This change makes wineboot terminate a process immediately. Is this really necessary to fix the bug? I'd expect that you want to handle the WAIT_OBJECT_0 case in addition to the WAIT_TIMEOUT case, and leave the timeout alone. --Juan
[1] http://blogs.msdn.com/michen/archive/2008/04/04/Application-termination-when... [2] http://blogs.msdn.com/oldnewthing/archive/2008/04/21/8413175.aspx
On Thu, Dec 10, 2009 at 1:20 PM, Juan Lang juan.lang@gmail.com wrote:
Hi Vincent,
- /* wait for app to quit on its own for a while */
- ret = WaitForSingleObject( process_handle, PROCQUIT_TIMEOUT );
- /* Check whether the app quit on its own */
- ret = WaitForSingleObject( process_handle, 0 ); CloseHandle( process_handle ); if (ret == WAIT_TIMEOUT)
I'm confused why you removed the timeout. The documented behavior[1, 2] is to wait a short timeout, show a dialog if the app hasn't quit by then, then kill it. This change makes wineboot terminate a process immediately. Is this really necessary to fix the bug? I'd expect that you want to handle the WAIT_OBJECT_0 case in addition to the WAIT_TIMEOUT case, and leave the timeout alone. --Juan
[1] http://blogs.msdn.com/michen/archive/2008/04/04/Application-termination-when... [2] http://blogs.msdn.com/oldnewthing/archive/2008/04/21/8413175.aspx
Yes, this is really necessary, and it's how Windows does it. I've tested it, and it's documented, by the posts you've linked in fact.
The timeout mentioned in [1] is in waiting for WM_ENDSESSION to return. This wait and timeout is handled by send_messages_with_timeout_dialog. However, once that message has returned, the process has done all the cleanup it needs and should be terminated. Since Windows terminates processes immediately after WM_ENDSESSION returns, there's no reason to believe the app will ever close itself and no reason to wait before killing it.
The timeout mentioned in [1] is in waiting for WM_ENDSESSION to return. This wait and timeout is handled by send_messages_with_timeout_dialog. However, once that message has returned, the process has done all the cleanup it needs and should be terminated. Since Windows terminates processes immediately after WM_ENDSESSION returns, there's no reason to believe the app will ever close itself and no reason to wait before killing it.
Ah, right. Thanks for the explanation, carry on :) --Juan