fix WakeUpIdle() when called from another thread while idle processing is in progress

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72829 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Paul Cornett
2012-10-31 05:43:01 +00:00
parent d8986023a3
commit 8a48b920f6

View File

@@ -143,29 +143,26 @@ bool wxApp::DoIdle()
#if wxUSE_THREADS #if wxUSE_THREADS
wxMutexLocker lock(m_idleMutex); wxMutexLocker lock(m_idleMutex);
#endif #endif
// if a new idle source was added during ProcessIdle
if (m_idleSourceId != 0) bool keepSource = false;
// if a new idle source has not been added, either as a result of idle
// processing above or by another thread calling WakeUpIdle()
if (m_idleSourceId == 0)
{ {
// remove it // if more idle processing was requested or pending events have appeared
g_source_remove(m_idleSourceId); if (needMore || HasPendingEvents())
m_idleSourceId = 0;
}
// Pending events can be added asynchronously,
// need to keep idle source if any have appeared
if (HasPendingEvents())
needMore = true;
// if more idle processing requested
if (needMore)
{ {
// keep this source installed // keep this source installed
m_idleSourceId = id_save; m_idleSourceId = id_save;
return true; keepSource = true;
} }
// add hooks and remove this source else // add hooks and remove this source
wx_add_idle_hooks(); wx_add_idle_hooks();
return false; }
// else remove this source, leave new one installed
// we must keep an idle source, otherwise a wakeup could be lost
return keepSource;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------