Improper message recursion revealed by recent desktop window
changes
Jesse Allen
the3dfxdude at gmail.com
Wed Mar 29 21:58:40 CST 2006
On 3/29/06, Troy Rollo <wine at troy.rollo.name> wrote:
> The recent changes to the desktop have revealed a problem with recursive
> processing of X messages. The problem started to manifest with commit
> 1a4f6e579b6aab685fae2e649fd5accee7ec0b4f (7th March). A symptom is a stack
> that looks like this:
>
> <application Window procedure>
> WINPROC_wrapper
> ...
> CallWindowProcW
> ...
> SendMessageW
> X11DRV_SetWindowPos
> SetWindowPos
> X11DRV_ConfigureNotify
> process_events
> X11DRV_MsgWaitForMultipleObjectsEx
> wait_message_reply
> send_inter_thread_message
> SendMessageTimeoutW
> SendMessageW
> send_parent_notify
> DestroyWindow
>
> In other words, a destroy notification is being sent to the parent window with
> SendMessageW, and before that message returns an unrelated X message is
> processed. Under Windows the equivalent could never happen - if a thread is
> in SendMessage(), the only messages that can be delivered to it are ones sent
> by SendMessage() from another thread.
>
> The consequences of this can be unpleasant if the code that processes (in this
> case a window movement notification) the message interferes with state that
> is being dealt with in earlier stack frames.
Yep, that's why the launching of War3 seems to only paint explorer or
the launch window depending on how I hacked wine.
This is the problem exhibited in bugs 4948, 4897, and 4847.
>
> wait_message_reply calls X11DRV_MsgWaitForMultipleObjectsEx with:
>
> res = USER_Driver->pMsgWaitForMultipleObjectsEx( 1, &server_queue,
> INFINITE, QS_ALLINPUT, 0 );
>
> The brute-force approach of changing this to the following makes the
> application work, but gives rise to some pack_message FIXMEs (for WM_NCPAINT
> and WM_ERASEBKGND), and since this is an extremely sensitive piece of code to
> change I thought it best left to people with more familiarity with it.
>
> --
> Troy Rollo - wine at troy.rollo.name
>
>
>
Last thing I did today was looking at the message passing and signal
handling. The signal handling doesn't look any different than before.
I figured something could be up with the message handling as it
seemed one thread was stomping on another but I don't know anything
about wineserver. I'll take a better look tomorrow!
Jesse
More information about the wine-devel
mailing list