]> git.saurik.com Git - wxWidgets.git/commitdiff
Don't block in wxEventLoopManual::Dispatch() if loop was exited.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 28 Apr 2012 22:24:54 +0000 (22:24 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 28 Apr 2012 22:24:54 +0000 (22:24 +0000)
If Exit() was called from a handler for one of the pending events we could
reenter Dispatch() and block there indefinitely if no other events were coming
and this was exactly what happened in wxFileSystemWatcher unit test,
preventing it from ever running to completion under Unix.

Fix this by checking m_shouldExit after executing the pending handlers and
before calling Dispatch().

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71304 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/evtloopcmn.cpp

index d824c3182240f579acb92d24107458fe753046f9..de9fce7230d2728d7fcbec491b95bdc6954efb4b 100644 (file)
@@ -104,8 +104,24 @@ bool wxEventLoopManual::ProcessEvents()
     // and this input is only removed from it when pending event handlers are
     // executed)
     if ( wxTheApp )
+    {
         wxTheApp->ProcessPendingEvents();
 
+        // One of the pending event handlers could have decided to exit the
+        // loop so check for the flag before trying to dispatch more events
+        // (which could block indefinitely if no more are coming).
+        if ( m_shouldExit )
+        {
+            // We still need to dispatch any remaining pending events, just as
+            // we do in the event loop in Run() if the loop is exited from a
+            // normal event handler.
+            while ( wxTheApp->HasPendingEvents() )
+                wxTheApp->ProcessPendingEvents();
+
+            return false;
+        }
+    }
+
     return Dispatch();
 }