1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-01 08:09:41 +02:00
audacity/mac/wxMac_additions/eventloops.patch
2016-07-31 21:14:06 -04:00

84 lines
2.5 KiB
Diff

From 8c9c17ca704f6c2b1469c861497ac7676dd67347 Mon Sep 17 00:00:00 2001
From: Paul Licameli <paul.licameli@audacityteam.org>
Date: Sun, 31 Jul 2016 11:55:29 -0400
Subject: [PATCH 1/3] Mac modal loops won't hang when other code uses old
Mutiprocessing...
... if you call the new wxEventLoopBase::SetBusyWaiting(true).
But this has the undesirable consequence of high CPU usage while the loop idles,
so this fix must be turned on only as needed by the application.
See the Audacity bug report that motivated this change:
http://bugzilla.audacityteam.org/show_bug.cgi?id=1338
---
include/wx/evtloop.h | 10 ++++++++++
src/common/evtloopcmn.cpp | 14 ++++++++++++++
src/osx/core/evtloop_cf.cpp | 3 ++-
3 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/include/wx/evtloop.h b/include/wx/evtloop.h
index 1133473..4b23610 100644
--- include/wx/evtloop.h
+++ include/wx/evtloop.h
@@ -177,6 +177,16 @@ public:
// set currently active (running) event loop
static void SetActive(wxEventLoopBase* loop);
+#ifdef __WXMAC__
+#define __WX_EVTLOOP_BUSY_WAITING__
+ static bool GetBusyWaiting();
+
+ // If the argument is true, cause modal dialogs to busy-wait for events,
+ // which seems to be necessary to avoid hanging when other code is using
+ // the old Multiprocessing API
+ static void SetBusyWaiting(bool busyWaiting);
+#endif
+
protected:
// real implementation of Run()
diff --git a/src/common/evtloopcmn.cpp b/src/common/evtloopcmn.cpp
index f7b5138..325fd54 100644
--- src/common/evtloopcmn.cpp
+++ src/common/evtloopcmn.cpp
@@ -56,6 +56,20 @@ void wxEventLoopBase::SetActive(wxEventLoopBase* loop)
wxTheApp->OnEventLoopEnter(loop);
}
+static bool g_busyWaiting = false;
+
+/* static */
+bool wxEventLoopBase::GetBusyWaiting()
+{
+ return g_busyWaiting;
+}
+
+/* static */
+void wxEventLoopBase::SetBusyWaiting(bool busyWaiting)
+{
+ g_busyWaiting = busyWaiting;
+}
+
int wxEventLoopBase::Run()
{
// event loops are not recursive, you need to create another loop!
diff --git a/src/osx/core/evtloop_cf.cpp b/src/osx/core/evtloop_cf.cpp
index 7e70dec..510af80 100644
--- src/osx/core/evtloop_cf.cpp
+++ src/osx/core/evtloop_cf.cpp
@@ -243,7 +243,8 @@ int wxCFEventLoop::DoProcessEvents()
}
else
#endif
- return DispatchTimeout( m_isInsideYield ? 0 : 1000 );
+ return DispatchTimeout
+ (m_isInsideYield || wxEventLoopBase::GetBusyWaiting() ? 0 : 1000 );
}
bool wxCFEventLoop::Dispatch()
--
2.3.2 (Apple Git-55)