From 3d166c77891c2a83de35c5fd10c0b23c131bc43b Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 23 Apr 2020 01:28:58 +0200 Subject: [PATCH] Consolidate stack-size and priority of rt-threads --- libs/ardour/ardour/audioengine.h | 3 ++- libs/ardour/rt_tasklist.cc | 5 ++--- libs/backends/alsa/alsa_audiobackend.cc | 9 ++++----- libs/backends/alsa/alsa_midi.cc | 2 +- libs/backends/alsa/alsa_slave.cc | 2 +- libs/backends/coreaudio/coreaudio_backend.cc | 7 +++---- libs/backends/dummy/dummy_audiobackend.cc | 5 ++--- libs/backends/portaudio/portaudio_backend.cc | 9 ++++----- libs/backends/portaudio/winmmemidi_output_device.cc | 5 +---- libs/backends/pulseaudio/pulseaudio_backend.cc | 9 ++++----- libs/pbd/pbd/pthread_utils.h | 10 ++++++++++ libs/pbd/pthread_utils.cc | 2 +- libs/zita-convolver/zita-convolver.cc | 2 +- 13 files changed, 36 insertions(+), 34 deletions(-) diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index 70006fcf87..3d13240fd6 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -37,6 +37,7 @@ #include #include "pbd/signals.h" +#include "pbd/pthread_utils.h" #include "pbd/stacktrace.h" #include "ardour/ardour.h" @@ -117,7 +118,7 @@ class LIBARDOUR_API AudioEngine : public PortManager, public SessionHandlePtr * - pbd_realtime_pthread_create * - pbd_set_thread_priority */ - virtual int client_real_time_priority () { return -22; } + virtual int client_real_time_priority () { return PBD_RT_PRI_PROC; } int backend_reset_requested(); void request_backend_reset(); diff --git a/libs/ardour/rt_tasklist.cc b/libs/ardour/rt_tasklist.cc index 1472f8e350..80f5b310aa 100644 --- a/libs/ardour/rt_tasklist.cc +++ b/libs/ardour/rt_tasklist.cc @@ -84,13 +84,12 @@ RTTaskList::reset_thread_list () g_atomic_int_set (&_threads_active, 1); for (uint32_t i = 0; i < num_threads; ++i) { pthread_t thread_id; - size_t stacksize = 100000; if (!AudioEngine::instance()->is_realtime () || - pbd_realtime_pthread_create (PBD_SCHED_FIFO, AudioEngine::instance()->client_real_time_priority(), stacksize, &thread_id, _thread_run, this)) { + pbd_realtime_pthread_create (PBD_SCHED_FIFO, AudioEngine::instance()->client_real_time_priority(), PBD_RT_STACKSIZE_HELP, &thread_id, _thread_run, this)) { pthread_attr_t attr; pthread_attr_init (&attr); - pthread_attr_setstacksize (&attr, stacksize); + pthread_attr_setstacksize (&attr, PBD_RT_STACKSIZE_HELP); if (pthread_create (&thread_id, &attr, _thread_run, this)) { PBD::fatal << _("Cannot create thread for TaskList!") << endmsg; /* NOT REACHED */ diff --git a/libs/backends/alsa/alsa_audiobackend.cc b/libs/backends/alsa/alsa_audiobackend.cc index 86d3d0e8ba..7dec3eb738 100644 --- a/libs/backends/alsa/alsa_audiobackend.cc +++ b/libs/backends/alsa/alsa_audiobackend.cc @@ -937,7 +937,7 @@ AlsaAudioBackend::_start (bool for_latency_measurement) _run = true; _port_change_flag = false; - if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, -20, 100000, + if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, PBD_RT_PRI_MAIN, PBD_RT_STACKSIZE_PROC, &_main_thread, pthread_process, this)) { if (pthread_create (&_main_thread, NULL, pthread_process, this)) @@ -1124,14 +1124,13 @@ AlsaAudioBackend::create_process_thread (boost::function func) { pthread_t thread_id; pthread_attr_t attr; - size_t stacksize = 100000; - ThreadData* td = new ThreadData (this, func, stacksize); + ThreadData* td = new ThreadData (this, func, PBD_RT_STACKSIZE_PROC); - if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, -22, stacksize, + if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, PBD_RT_PRI_PROC, PBD_RT_STACKSIZE_PROC, &thread_id, alsa_process_thread, td)) { pthread_attr_init (&attr); - pthread_attr_setstacksize (&attr, stacksize); + pthread_attr_setstacksize (&attr, PBD_RT_STACKSIZE_PROC); if (pthread_create (&thread_id, &attr, alsa_process_thread, td)) { PBD::error << _("AudioEngine: cannot create process thread.") << endmsg; pthread_attr_destroy (&attr); diff --git a/libs/backends/alsa/alsa_midi.cc b/libs/backends/alsa/alsa_midi.cc index db64611919..ce3a23d1ad 100644 --- a/libs/backends/alsa/alsa_midi.cc +++ b/libs/backends/alsa/alsa_midi.cc @@ -73,7 +73,7 @@ static void * pthread_process (void *arg) int AlsaMidiIO::start () { - if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, -21, 100000, + if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, PBD_RT_PRI_MIDI, PBD_RT_STACKSIZE_HELP, &_main_thread, pthread_process, this)) { if (pthread_create (&_main_thread, NULL, pthread_process, this)) { diff --git a/libs/backends/alsa/alsa_slave.cc b/libs/backends/alsa/alsa_slave.cc index 43c2877229..de7752e043 100644 --- a/libs/backends/alsa/alsa_slave.cc +++ b/libs/backends/alsa/alsa_slave.cc @@ -108,7 +108,7 @@ AlsaAudioSlave::start () } _run = true; - if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, -20, 100000, + if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, PBD_RT_PRI_MAIN, PBD_RT_STACKSIZE_HELP, &_thread, _process_thread, this)) { if (pthread_create (&_thread, NULL, _process_thread, this)) { diff --git a/libs/backends/coreaudio/coreaudio_backend.cc b/libs/backends/coreaudio/coreaudio_backend.cc index ab38ad9517..33c4a32750 100644 --- a/libs/backends/coreaudio/coreaudio_backend.cc +++ b/libs/backends/coreaudio/coreaudio_backend.cc @@ -847,14 +847,13 @@ CoreAudioBackend::create_process_thread (boost::function func) { pthread_t thread_id; pthread_attr_t attr; - size_t stacksize = 100000; - ThreadData* td = new ThreadData (this, func, stacksize); + ThreadData* td = new ThreadData (this, func, PBD_RT_STACKSIZE_PROC); - if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, -22, stacksize, + if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, PBD_RT_PRI_PROC, PBD_RT_STACKSIZE_PROC, &thread_id, coreaudio_process_thread, td)) { pthread_attr_init (&attr); - pthread_attr_setstacksize (&attr, stacksize); + pthread_attr_setstacksize (&attr, PBD_RT_STACKSIZE_PROC); if (pthread_create (&thread_id, &attr, coreaudio_process_thread, td)) { PBD::error << _("AudioEngine: cannot create process thread.") << endmsg; pthread_attr_destroy (&attr); diff --git a/libs/backends/dummy/dummy_audiobackend.cc b/libs/backends/dummy/dummy_audiobackend.cc index 34de0da52e..ca9a93e583 100644 --- a/libs/backends/dummy/dummy_audiobackend.cc +++ b/libs/backends/dummy/dummy_audiobackend.cc @@ -555,11 +555,10 @@ DummyAudioBackend::create_process_thread (boost::function func) { pthread_t thread_id; pthread_attr_t attr; - size_t stacksize = 100000; pthread_attr_init (&attr); - pthread_attr_setstacksize (&attr, stacksize); - ThreadData* td = new ThreadData (this, func, stacksize); + pthread_attr_setstacksize (&attr, PBD_RT_STACKSIZE_PROC); + ThreadData* td = new ThreadData (this, func, PBD_RT_STACKSIZE_PROC); if (pthread_create (&thread_id, &attr, dummy_process_thread, td)) { PBD::error << _("AudioEngine: cannot create process thread.") << endmsg; diff --git a/libs/backends/portaudio/portaudio_backend.cc b/libs/backends/portaudio/portaudio_backend.cc index 779bfc423b..a7c74fab4e 100644 --- a/libs/backends/portaudio/portaudio_backend.cc +++ b/libs/backends/portaudio/portaudio_backend.cc @@ -785,7 +785,7 @@ PortAudioBackend::process_callback(const float* input, bool PortAudioBackend::start_blocking_process_thread () { - if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, -20, 100000, + if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, PBD_RT_PRI_MAIN, PBD_RT_STACKSIZE_PROC, &_main_blocking_thread, blocking_thread_func, this)) { if (pthread_create (&_main_blocking_thread, NULL, blocking_thread_func, this)) @@ -1110,14 +1110,13 @@ PortAudioBackend::create_process_thread (boost::function func) { pthread_t thread_id; pthread_attr_t attr; - size_t stacksize = 100000; - ThreadData* td = new ThreadData (this, func, stacksize); + ThreadData* td = new ThreadData (this, func, PBD_RT_STACKSIZE_PROC); - if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, -22, stacksize, + if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, PBD_RT_PRI_PROC, PBD_RT_STACKSIZE_PROC, &thread_id, portaudio_process_thread, td)) { pthread_attr_init (&attr); - pthread_attr_setstacksize (&attr, stacksize); + pthread_attr_setstacksize (&attr, PBD_RT_STACKSIZE_PROC); if (pthread_create (&thread_id, &attr, portaudio_process_thread, td)) { DEBUG_AUDIO("Cannot create process thread."); pthread_attr_destroy (&attr); diff --git a/libs/backends/portaudio/winmmemidi_output_device.cc b/libs/backends/portaudio/winmmemidi_output_device.cc index 8d699f25cc..d26925b8a3 100644 --- a/libs/backends/portaudio/winmmemidi_output_device.cc +++ b/libs/backends/portaudio/winmmemidi_output_device.cc @@ -228,11 +228,8 @@ WinMMEMidiOutputDevice::start_midi_output_thread () { m_thread_quit = false; - //pthread_attr_t attr; - size_t stacksize = 100000; - // TODO Use native threads - if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, -21, stacksize, + if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, PBD_RT_PRI_MIDI, PBD_RT_STACKSIZE_HELP, &m_output_thread_handle, midi_output_thread, this)) { return false; } diff --git a/libs/backends/pulseaudio/pulseaudio_backend.cc b/libs/backends/pulseaudio/pulseaudio_backend.cc index 2af182a94e..dbdcf55f84 100644 --- a/libs/backends/pulseaudio/pulseaudio_backend.cc +++ b/libs/backends/pulseaudio/pulseaudio_backend.cc @@ -628,7 +628,7 @@ PulseAudioBackend::_start (bool /*for_latency_measurement*/) _run = true; _port_change_flag = false; - if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, -20, 100000, + if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, PBD_RT_PRI_MAIN, PBD_RT_STACKSIZE_PROC, &_main_thread, pthread_process, this)) { if (pthread_create (&_main_thread, NULL, pthread_process, this)) { PBD::error << _("PulseAudioBackend: failed to create process thread.") << endmsg; @@ -744,14 +744,13 @@ PulseAudioBackend::create_process_thread (boost::function func) { pthread_t thread_id; pthread_attr_t attr; - size_t stacksize = 100000; - ThreadData* td = new ThreadData (this, func, stacksize); + ThreadData* td = new ThreadData (this, func, PBD_RT_STACKSIZE_PROC); - if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, -22, stacksize, + if (pbd_realtime_pthread_create (PBD_SCHED_FIFO, PBD_RT_PRI_PROC, PBD_RT_STACKSIZE_PROC, &thread_id, pulse_process_thread, td)) { pthread_attr_init (&attr); - pthread_attr_setstacksize (&attr, stacksize); + pthread_attr_setstacksize (&attr, PBD_RT_STACKSIZE_PROC); if (pthread_create (&thread_id, &attr, pulse_process_thread, td)) { PBD::error << _("AudioEngine: cannot create process thread.") << endmsg; pthread_attr_destroy (&attr); diff --git a/libs/pbd/pbd/pthread_utils.h b/libs/pbd/pbd/pthread_utils.h index 3296d4471c..6eedbd95c8 100644 --- a/libs/pbd/pbd/pthread_utils.h +++ b/libs/pbd/pbd/pthread_utils.h @@ -48,6 +48,16 @@ #include "pbd/libpbd_visibility.h" #include "pbd/signals.h" +#define PBD_RT_STACKSIZE_PROC 0x20000 // 128kB +#define PBD_RT_STACKSIZE_HELP 0x08000 // 32kB + +/* these are relative to sched_get_priority_max() + * see pbd_absolute_rt_priority() + */ +#define PBD_RT_PRI_MAIN -20 +#define PBD_RT_PRI_MIDI -21 +#define PBD_RT_PRI_PROC -22 + LIBPBD_API int pthread_create_and_store (std::string name, pthread_t *thread, void * (*start_routine)(void *), void * arg); LIBPBD_API void pthread_cancel_one (pthread_t thread); LIBPBD_API void pthread_cancel_all (); diff --git a/libs/pbd/pthread_utils.cc b/libs/pbd/pthread_utils.cc index f655dbd5b4..1d179f9cac 100644 --- a/libs/pbd/pthread_utils.cc +++ b/libs/pbd/pthread_utils.cc @@ -132,7 +132,7 @@ pthread_create_and_store (string name, pthread_t *thread, void * (*start_routin // set default stack size to sensible default for memlocking pthread_attr_init(&default_attr); - pthread_attr_setstacksize(&default_attr, 500000); + pthread_attr_setstacksize(&default_attr, 0x80000); // 512kB ThreadStartWithName* ts = new ThreadStartWithName (start_routine, arg, name); diff --git a/libs/zita-convolver/zita-convolver.cc b/libs/zita-convolver/zita-convolver.cc index 20971c99e6..dad0fcdee8 100644 --- a/libs/zita-convolver/zita-convolver.cc +++ b/libs/zita-convolver/zita-convolver.cc @@ -621,7 +621,7 @@ Convlevel::start (int abspri, int policy) pthread_attr_setschedparam (&attr, &parm); pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM); pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED); - pthread_attr_setstacksize (&attr, 0x10000); + pthread_attr_setstacksize (&attr, 0x10000); // 64kB pthread_create (&_pthr, &attr, static_main, this); pthread_attr_destroy (&attr); }