This sometimes fails on Windows because we check the queue status before the other thread second call to SendMessage has been made (or received).
Adding a synchronization here could help, although there should not be any long delay as we already seen the first SendMessage call -asserted by the send_message_1 sequence.
https://testbot.winehq.org/JobDetails.pl?Key=59890#k106
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/user32/tests/msg.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c index c73f9ac36b9..593a1e65047 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c @@ -17475,6 +17475,7 @@ static DWORD WINAPI SendMessage_thread_1(void *param)
trace("thread: call SendMessage\n"); SendMessageA(wnd_event->hwnd, WM_USER+2, 0, 0); + SetEvent(wnd_event->stop_event);
trace("thread: call SendMessage\n"); SendMessageA(wnd_event->hwnd, WM_USER+3, 0, 0); @@ -17501,6 +17502,7 @@ static DWORD WINAPI SendMessage_thread_2(void *param)
trace("thread: call SendMessage\n"); SendMessageA(wnd_event->hwnd, WM_USER+2, 0, 0); + SetEvent(wnd_event->stop_event);
trace("thread: call SendMessage\n"); SendMessageA(wnd_event->hwnd, WM_USER+3, 0, 0); @@ -17517,6 +17519,7 @@ static void test_SendMessage_other_thread(int thread_n) MSG msg;
wnd_event.start_event = CreateEventA(NULL, 0, 0, NULL); + wnd_event.stop_event = CreateEventA(NULL, 0, 0, NULL);
wnd_event.hwnd = CreateWindowExA(0, "TestWindowClass", NULL, WS_OVERLAPPEDWINDOW, 100, 100, 200, 200, 0, 0, 0, NULL); @@ -17551,6 +17554,10 @@ static void test_SendMessage_other_thread(int thread_n) DispatchMessageA(&msg); ok_sequence(send_message_1, "SendMessage from other thread 1", thread_n == 2);
+ ret = WaitForSingleObject(wnd_event.stop_event, 100); + todo_wine_if (thread_n == 2) + ok(ret == WAIT_OBJECT_0, "WaitForSingleObject failed, ret:%x\n", ret); + /* intentionally yield */ MsgWaitForMultipleObjects(0, NULL, FALSE, 100, qs_all_input);
@@ -17587,6 +17594,9 @@ todo_wine_if (thread_n == 2)
flush_events(); flush_sequence(); + + CloseHandle(wnd_event.start_event); + CloseHandle(wnd_event.stop_event); }
static LRESULT CALLBACK insendmessage_wnd_proc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )