Consolidate relative sched_get_priority computation
authorRobin Gareus <robin@gareus.org>
Wed, 10 Oct 2018 23:47:46 +0000 (01:47 +0200)
committerRobin Gareus <robin@gareus.org>
Thu, 11 Oct 2018 13:29:50 +0000 (15:29 +0200)
libs/pbd/pbd/pthread_utils.h
libs/pbd/pthread_utils.cc

index e917fa27cebce2d95bdc9598354ccbe796337f67..f223d1c22e15ff020d15229e246ff670bab2b8fb 100644 (file)
@@ -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);
 
index 118c54b97fc931d616a1327b475ba65ca4cc383a..64ac8bb5630b329bf6113f3937c9170a9546ace8 100644 (file)
@@ -208,6 +208,32 @@ pthread_cancel_one (pthread_t thread)
        pthread_mutex_unlock (&thread_map_lock);
 }
 
+int
+pbd_absolute_rt_priority (int policy, int priority)
+{
+       /* 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
+
+       if (priority == 0) {
+               /* use default. XXX this should be relative to audio (JACK) thread,
+                * internal backends use -20 (Audio), -21 (MIDI), -22 (compuation)
+                */
+               priority = 7; // BaseUI backwards compat.
+       }
+
+       if (priority > 0) {
+               priority += p_min;
+       } else {
+               priority += p_max;
+       }
+       if (priority > p_max) priority = p_max;
+       if (priority < p_min) priority = p_min;
+       return priority;
+}
+
+
+
 int
 pbd_realtime_pthread_create (
                const int policy, int priority, const size_t stacksize,
@@ -220,12 +246,7 @@ pbd_realtime_pthread_create (
        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;
+       parm.sched_priority = pbd_absolute_rt_priority (policy, priority);
 
        pthread_attr_init (&attr);
        pthread_attr_setschedpolicy (&attr, policy);
@@ -237,32 +258,12 @@ pbd_realtime_pthread_create (
        pthread_attr_destroy (&attr);
        return rv;
 }
-
 int
 pbd_set_thread_priority (pthread_t thread, const int policy, int priority)
 {
        struct sched_param param;
        memset (&param, 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
-
-       if (priority == 0) {
-               /* use default. XXX this should be relative to audio (JACK) thread,
-                * internal backends use -20 (Audio), -21 (MIDI), -22 (compuation)
-                */
-               priority = 7; // BaseUI backwards compat.
-       }
-
-       if (priority > 0) {
-               priority += p_min;
-       } else {
-               priority += p_max;
-       }
-       if (priority > p_max) priority = p_max;
-       if (priority < p_min) priority = p_min;
-       param.sched_priority = priority;
+       param.sched_priority = pbd_absolute_rt_priority (policy, priority);
 
        return pthread_setschedparam (thread, SCHED_FIFO, &param);
 }