From: Sebastian Lackner Subject: [3/3] ole32: Don't process window events when APC calls are queued. Message-Id: <546F0DE3.3020706@fds-team.de> Date: Fri, 21 Nov 2014 11:03:15 +0100 The recently committed tests for MsgWaitForMultipleObjectsEx show that only CoWaitForMultipleHandles behaves differently. --- dlls/ole32/compobj.c | 17 ++++++++++++++--- dlls/ole32/tests/compobj.c | 1 - 2 files changed, 14 insertions(+), 4 deletions(-) From 9e57c44fe0cd7491de451aa9624a409d470b6c42 Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Wed, 5 Nov 2014 00:49:59 +0100 Subject: ole32: Don't process window events when APC calls are queued. --- dlls/ole32/compobj.c | 17 ++++++++++++++--- dlls/ole32/tests/compobj.c | 1 - 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c index 1d9b943..da466c4 100644 --- a/dlls/ole32/compobj.c +++ b/dlls/ole32/compobj.c @@ -4427,6 +4427,7 @@ HRESULT WINAPI CoWaitForMultipleHandles(DWORD dwFlags, DWORD dwTimeout, DWORD start_time = GetTickCount(); APARTMENT *apt = COM_CurrentApt(); BOOL message_loop = apt && !apt->multi_threaded; + BOOL check_apc = (dwFlags & COWAIT_ALERTABLE) != 0; TRACE("(0x%08x, 0x%08x, %d, %p, %p)\n", dwFlags, dwTimeout, cHandles, pHandles, lpdwindex); @@ -4460,9 +4461,19 @@ HRESULT WINAPI CoWaitForMultipleHandles(DWORD dwFlags, DWORD dwTimeout, TRACE("waiting for rpc completion or window message\n"); - res = MsgWaitForMultipleObjectsEx(cHandles, pHandles, - (dwTimeout == INFINITE) ? INFINITE : start_time + dwTimeout - now, - QS_SENDMESSAGE | QS_ALLPOSTMESSAGE | QS_PAINT, wait_flags); + res = WAIT_TIMEOUT; + + if (check_apc) + { + res = WaitForMultipleObjectsEx(cHandles, pHandles, + (dwFlags & COWAIT_WAITALL) != 0, 0, TRUE); + check_apc = FALSE; + } + + if (res == WAIT_TIMEOUT) + res = MsgWaitForMultipleObjectsEx(cHandles, pHandles, + (dwTimeout == INFINITE) ? INFINITE : start_time + dwTimeout - now, + QS_SENDMESSAGE | QS_ALLPOSTMESSAGE | QS_PAINT, wait_flags); if (res == WAIT_OBJECT_0 + cHandles) /* messages available */ { diff --git a/dlls/ole32/tests/compobj.c b/dlls/ole32/tests/compobj.c index 38b21c9..eed5ac8 100644 --- a/dlls/ole32/tests/compobj.c +++ b/dlls/ole32/tests/compobj.c @@ -2241,7 +2241,6 @@ static void test_CoWaitForMultipleHandles(void) ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr); ok(index == WAIT_IO_COMPLETION, "expected index WAIT_IO_COMPLETION, got %u\n", index); success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); - todo_wine ok(success, "CoWaitForMultipleHandles unexpectedly pumped messages\n"); /* test with COWAIT_INPUTAVAILABLE (semaphores are still locked) */ -- 2.1.3