Module: wine Branch: master Commit: f6f55058e4853d7685467af74e90b428a6234941 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f6f55058e4853d7685467af74e...
Author: Sebastian Lackner sebastian@fds-team.de Date: Wed Nov 5 00:49:59 2014 +0100
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) */