13
0

Fix window process thread priorities

While POSIX defines a single contiguous range of numbers that
determine a thread's priority. Win32 defines priority classes
and priority levels relative to these classes.

pthread maps those to -15 .. +15 with the top six ones
corresponding to REALTIME_PRIORITY_CLASS and max being
THREAD_PRIORITY_TIME_CRITICAL

Note that the PA backend can USE_MMCSS_THREAD_PRIORITIES
and PBD::MMCSS::set_thread_characteristics() directly for
the I/O threads.
This commit is contained in:
Robin Gareus 2021-05-14 01:59:20 +02:00
parent 4d269729b1
commit 28619fe71b
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
2 changed files with 17 additions and 10 deletions

View File

@ -54,9 +54,15 @@
/* these are relative to sched_get_priority_max() /* these are relative to sched_get_priority_max()
* see pbd_absolute_rt_priority() * see pbd_absolute_rt_priority()
*/ */
#define PBD_RT_PRI_MAIN -20 #ifdef PLATFORM_WINDOWS
#define PBD_RT_PRI_MIDI -21 # define PBD_RT_PRI_MAIN -1
#define PBD_RT_PRI_PROC -22 # define PBD_RT_PRI_MIDI -2
# define PBD_RT_PRI_PROC -2
#else
# define PBD_RT_PRI_MAIN -20
# define PBD_RT_PRI_MIDI -21
# define PBD_RT_PRI_PROC -22
#endif
LIBPBD_API int pthread_create_and_store (std::string name, pthread_t *thread, void * (*start_routine)(void *), void * arg); 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_one (pthread_t thread);

View File

@ -288,18 +288,19 @@ pbd_absolute_rt_priority (int policy, int priority)
/* use default. XXX this should be relative to audio (JACK) thread, /* use default. XXX this should be relative to audio (JACK) thread,
* internal backends use -20 (Audio), -21 (MIDI), -22 (compuation) * internal backends use -20 (Audio), -21 (MIDI), -22 (compuation)
*/ */
priority = 7; // BaseUI backwards compat. priority = (p_min + p_max) / 2;
} } else if (priority > 0) {
if (priority > 0) {
priority += p_min; priority += p_min;
} else { } else {
priority += p_max; priority += p_max + 1;
} }
if (priority > p_max)
if (priority > p_max) {
priority = p_max; priority = p_max;
if (priority < p_min) }
if (priority < p_min) {
priority = p_min; priority = p_min;
}
return priority; return priority;
} }