summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuuso Alasuutari <juuso.alasuutari@gmail.com>2019-09-18 22:56:22 +0300
committerFilipe Coelho <falktx@falktx.com>2019-09-18 21:40:17 +0100
commit0ee218826b299a95f937b7c88f10af56534d6cbd (patch)
tree52fe19aecc52982c5deeaf7c03786e9ffef8ca0b
parent4341f8086f795bdbb3203aa3046098ddef2f6651 (diff)
downloadjack2-0ee218826b299a95f937b7c88f10af56534d6cbd.tar.gz
If pthread_setschedparam() in JackPosixThread::AcquireRealTimeImp() fails
try again with the SCHED_RESET_ON_FORK flag before giving up. This fixes PulseAudio's JACK modules not being granted real-time scheduling. Signed-off-by: Juuso Alasuutari <juuso.alasuutari@gmail.com>
-rw-r--r--posix/JackPosixThread.cpp24
1 files changed, 17 insertions, 7 deletions
diff --git a/posix/JackPosixThread.cpp b/posix/JackPosixThread.cpp
index 44205a9e..86bf729d 100644
--- a/posix/JackPosixThread.cpp
+++ b/posix/JackPosixThread.cpp
@@ -28,6 +28,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//#define JACK_SCHED_POLICY SCHED_RR
#define JACK_SCHED_POLICY SCHED_FIFO
+#if defined(__linux__) && !defined(SCHED_RESET_ON_FORK)
+# define SCHED_RESET_ON_FORK 0x40000000
+#endif
+
namespace Jack
{
@@ -237,13 +241,19 @@ int JackPosixThread::AcquireRealTimeImp(jack_native_thread_t thread, int priorit
jack_log("JackPosixThread::AcquireRealTimeImp priority = %d", priority);
- if ((res = pthread_setschedparam(thread, JACK_SCHED_POLICY, &rtparam)) != 0) {
- jack_error("Cannot use real-time scheduling (RR/%d)"
- "(%d: %s)", rtparam.sched_priority, res,
- strerror(res));
- return -1;
- }
- return 0;
+ if ((res = pthread_setschedparam(thread, JACK_SCHED_POLICY, &rtparam)) == 0)
+ return 0;
+
+#ifdef SCHED_RESET_ON_FORK
+ jack_log("pthread_setschedparam() failed (%d), trying with SCHED_RESET_ON_FORK.", res);
+ if ((res = pthread_setschedparam(thread, JACK_SCHED_POLICY|SCHED_RESET_ON_FORK, &rtparam)) == 0)
+ return 0;
+#endif
+
+ jack_error("Cannot use real-time scheduling (RR/%d)"
+ " (%d: %s)", rtparam.sched_priority, res,
+ strerror(res));
+ return -1;
}
int JackPosixThread::DropRealTime()