win32_async_check() can loop indefinitely; 5.8.8 regression
Jan Dubois [Thu, 16 Mar 2006 16:11:48 +0000 (08:11 -0800)]
Message-ID: <02ab01c64957$62142e70$6062a8c0@candy>

p4raw-id: //depot/perl@27527

win32/win32.c

index 0f67ba1..e2b6e0b 100644 (file)
@@ -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