summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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.patch109
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;
+