From: Jan Dubois Date: Thu, 16 Mar 2006 16:11:48 +0000 (-0800) Subject: win32_async_check() can loop indefinitely; 5.8.8 regression X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=c71e9bcc0530c131e1aaebb9356d24631b39217c;p=p5sagit%2Fp5-mst-13.2.git win32_async_check() can loop indefinitely; 5.8.8 regression Message-ID: <02ab01c64957$62142e70$6062a8c0@candy> p4raw-id: //depot/perl@27527 --- diff --git a/win32/win32.c b/win32/win32.c index 0f67ba1..e2b6e0b 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -1784,8 +1784,17 @@ win32_async_check(pTHX) w32_poll_count = 0; - if (hwnd == INVALID_HANDLE_VALUE) + if (hwnd == INVALID_HANDLE_VALUE) { + /* Call PeekMessage() to mark all pending messages in the queue as "old". + * This is necessary when we are being called by win32_msgwait() to + * make sure MsgWaitForMultipleObjects() stops reporting the same waiting + * message over and over. An example how this can happen is when + * Perl is calling win32_waitpid() inside a GUI application and the GUI + * is generating messages before the process terminated. + */ + PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE|PM_NOYIELD); return 1; + } /* Passing PeekMessage -1 as HWND (2nd arg) only get PostThreadMessage() messages * and ignores window messages - should co-exist better with windows apps e.g. Tk