From 78a3683233bc13e58badd7adb9b86995b81eb0c7 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 11 Oct 2018 01:47:46 +0200 Subject: [PATCH] Consolidate relative sched_get_priority computation --- libs/pbd/pbd/pthread_utils.h | 1 + libs/pbd/pthread_utils.cc | 71 ++++++++++++++++++------------------ 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/libs/pbd/pbd/pthread_utils.h b/libs/pbd/pbd/pthread_utils.h index e917fa27ce..f223d1c22e 100644 --- a/libs/pbd/pbd/pthread_utils.h +++ b/libs/pbd/pbd/pthread_utils.h @@ -60,6 +60,7 @@ LIBPBD_API int pbd_realtime_pthread_create ( void *(*start_routine) (void *), void *arg); +LIBPBD_API int pbd_absolute_rt_priority (int policy, int priority); LIBPBD_API int pbd_set_thread_priority (pthread_t, const int policy, int priority); LIBPBD_API bool pbd_mach_set_realtime_policy (pthread_t thread_id, double period_ns); diff --git a/libs/pbd/pthread_utils.cc b/libs/pbd/pthread_utils.cc index 118c54b97f..64ac8bb563 100644 --- a/libs/pbd/pthread_utils.cc +++ b/libs/pbd/pthread_utils.cc @@ -209,41 +209,8 @@ pthread_cancel_one (pthread_t thread) } int -pbd_realtime_pthread_create ( - const int policy, int priority, const size_t stacksize, - pthread_t *thread, - void *(*start_routine) (void *), - void *arg) +pbd_absolute_rt_priority (int policy, int priority) { - int rv; - - pthread_attr_t attr; - struct sched_param parm; - - const int p_min = sched_get_priority_min (policy); - const int p_max = sched_get_priority_max (policy); - priority += p_max; - if (priority > p_max) priority = p_max; - if (priority < p_min) priority = p_min; - parm.sched_priority = priority; - - pthread_attr_init (&attr); - pthread_attr_setschedpolicy (&attr, policy); - pthread_attr_setschedparam (&attr, &parm); - pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM); - pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED); - pthread_attr_setstacksize (&attr, stacksize); - rv = pthread_create (thread, &attr, start_routine, arg); - pthread_attr_destroy (&attr); - return rv; -} - -int -pbd_set_thread_priority (pthread_t thread, const int policy, int priority) -{ - struct sched_param param; - memset (¶m, 0, sizeof (param)); - /* POSIX requires a spread of at least 32 steps between min..max */ const int p_min = sched_get_priority_min (policy); // Linux: 1 const int p_max = sched_get_priority_max (policy); // Linux: 99 @@ -262,7 +229,41 @@ pbd_set_thread_priority (pthread_t thread, const int policy, int priority) } if (priority > p_max) priority = p_max; if (priority < p_min) priority = p_min; - param.sched_priority = priority; + return priority; +} + + + +int +pbd_realtime_pthread_create ( + const int policy, int priority, const size_t stacksize, + pthread_t *thread, + void *(*start_routine) (void *), + void *arg) +{ + int rv; + + pthread_attr_t attr; + struct sched_param parm; + + parm.sched_priority = pbd_absolute_rt_priority (policy, priority); + + pthread_attr_init (&attr); + pthread_attr_setschedpolicy (&attr, policy); + pthread_attr_setschedparam (&attr, &parm); + pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM); + pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED); + pthread_attr_setstacksize (&attr, stacksize); + rv = pthread_create (thread, &attr, start_routine, arg); + pthread_attr_destroy (&attr); + return rv; +} +int +pbd_set_thread_priority (pthread_t thread, const int policy, int priority) +{ + struct sched_param param; + memset (¶m, 0, sizeof (param)); + param.sched_priority = pbd_absolute_rt_priority (policy, priority); return pthread_setschedparam (thread, SCHED_FIFO, ¶m); }