diff options
Diffstat (limited to 'x11-libs/wxGTK/files/wxGTK-2.8.7-race-fix.patch')
-rw-r--r-- | x11-libs/wxGTK/files/wxGTK-2.8.7-race-fix.patch | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/x11-libs/wxGTK/files/wxGTK-2.8.7-race-fix.patch b/x11-libs/wxGTK/files/wxGTK-2.8.7-race-fix.patch new file mode 100644 index 000000000000..c58f3956d453 --- /dev/null +++ b/x11-libs/wxGTK/files/wxGTK-2.8.7-race-fix.patch @@ -0,0 +1,109 @@ +--- wxWidgets/src/gtk/app.cpp 2008/03/13 02:56:21 52464 ++++ wxWidgets/src/gtk/app.cpp 2008/03/13 04:37:03 52465 +@@ -174,59 +174,63 @@ + if (!wxTheApp) + return false; + +- bool moreIdles = false; +- ++ guint idleID_save; ++ { ++ // Allow another idle source to be added while this one is busy. ++ // Needed if an idle event handler runs a new event loop, ++ // for example by showing a dialog. ++#if wxUSE_THREADS ++ wxMutexLocker lock(gs_idleTagsMutex); ++#endif ++ idleID_save = wxTheApp->m_idleTag; ++ wxTheApp->m_idleTag = 0; ++ g_isIdle = true; ++ wxAddEmissionHook(); ++ } + #ifdef __WXDEBUG__ + // don't generate the idle events while the assert modal dialog is shown, + // this matches the behavior of wxMSW +- if (!wxTheApp->IsInAssert()) ++ if (wxTheApp->IsInAssert()) ++ return false; + #endif // __WXDEBUG__ +- { +- guint idleID_save; +- { +- // Allow another idle source to be added while this one is busy. +- // Needed if an idle event handler runs a new event loop, +- // for example by showing a dialog. +-#if wxUSE_THREADS +- wxMutexLocker lock(gs_idleTagsMutex); +-#endif +- idleID_save = wxTheApp->m_idleTag; +- wxTheApp->m_idleTag = 0; +- g_isIdle = true; +- wxAddEmissionHook(); +- } + +- // When getting called from GDK's time-out handler +- // we are no longer within GDK's grab on the GUI +- // thread so we must lock it here ourselves. +- gdk_threads_enter(); +- +- // Send idle event to all who request them as long as +- // no events have popped up in the event queue. +- do { +- moreIdles = wxTheApp->ProcessIdle(); +- } while (moreIdles && gtk_events_pending() == 0); ++ // When getting called from GDK's time-out handler ++ // we are no longer within GDK's grab on the GUI ++ // thread so we must lock it here ourselves. ++ gdk_threads_enter(); + +- // Release lock again +- gdk_threads_leave(); +- +- { +- // If another idle source was added, remove it ++ // Send idle event to all who request them as long as ++ // no events have popped up in the event queue. ++ bool moreIdles; ++ do { ++ moreIdles = wxTheApp->ProcessIdle(); ++ } while (moreIdles && gtk_events_pending() == 0); ++ ++ // Release lock again ++ gdk_threads_leave(); ++ + #if wxUSE_THREADS +- wxMutexLocker lock(gs_idleTagsMutex); ++ wxMutexLocker lock(gs_idleTagsMutex); + #endif +- if (wxTheApp->m_idleTag != 0) +- g_source_remove(wxTheApp->m_idleTag); +- wxTheApp->m_idleTag = idleID_save; +- g_isIdle = false; +- } +- } ++ // If another idle source was added, remove it ++ if (wxTheApp->m_idleTag != 0) ++ g_source_remove(wxTheApp->m_idleTag); ++ wxTheApp->m_idleTag = idleID_save; ++ g_isIdle = false; + +- if (!moreIdles) +- { + #if wxUSE_THREADS +- wxMutexLocker lock(gs_idleTagsMutex); ++ if (wxPendingEventsLocker) ++ wxPendingEventsLocker->Enter(); + #endif ++ // Pending events can be added asynchronously, ++ // need to keep idle source if any have appeared ++ moreIdles = moreIdles || (wxPendingEvents && !wxPendingEvents->IsEmpty()); ++#if wxUSE_THREADS ++ if (wxPendingEventsLocker) ++ wxPendingEventsLocker->Leave(); ++#endif ++ if (!moreIdles) ++ { + // Indicate that we are now in idle mode and event handlers + // will have to reinstall the idle handler again. + g_isIdle = true; + |