From 58893237cf417255c72921cf98566dfeee974343 Mon Sep 17 00:00:00 2001 From: Juuso Alasuutari Date: Wed, 18 Sep 2019 22:56:22 +0300 Subject: [PATCH] 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 --- posix/JackPosixThread.cpp | 24 +++++++++++++++++------- 1 file 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()