From 2c4c2228535c589d16ed2a0f4880b0f4784f9ba9 Mon Sep 17 00:00:00 2001 From: Dan HorĂ¡k Date: Apr 01 2008 12:56:47 +0000 Subject: - added fix for a race condition (rh bug #440011) --- diff --git a/wxGTK-2.8.7-race-fix.patch b/wxGTK-2.8.7-race-fix.patch new file mode 100644 index 0000000..c58f395 --- /dev/null +++ b/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; + diff --git a/wxGTK.spec b/wxGTK.spec index 0c0f330..ea0f545 100644 --- a/wxGTK.spec +++ b/wxGTK.spec @@ -6,7 +6,7 @@ Name: wxGTK Version: 2.8.7 -Release: 1%{?dist} +Release: 2%{?dist} Summary: GTK2 port of the wxWidgets GUI library # The wxWindows licence is the LGPL with a specific exemption allowing # distribution of derived binaries under any terms. (This will eventually @@ -15,6 +15,7 @@ License: wxWidgets Library Licence Group: System Environment/Libraries URL: http://www.wxwidgets.org/ Source0: http://dl.sf.net/wxwindows/%{name}-%{version}.tar.bz2 +Patch0: wxGTK-2.8.7-race-fix.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) @@ -121,6 +122,7 @@ libraries or the X Window System. %prep %setup -q +%patch0 -p1 -b .racefix sed -i -e 's|/usr/lib\b|%{_libdir}|' wx-config.in configure @@ -262,6 +264,9 @@ rm -rf $RPM_BUILD_ROOT %changelog +* Tue Apr 1 2008 Dan Horak - 2.8.7-2 +- added fix for a race condition (rh bug #440011) + * Wed Feb 20 2008 Matthew Miller - 2.8.7-1 - update to 2.8.7 (rh bug #369621, etc.) - split base libs into separate wxBase package (rh bug #357961)