Skip to content

Commit f2fe9d3

Browse files
committed
extended thread priorities
1 parent 39878be commit f2fe9d3

File tree

2 files changed

+36
-11
lines changed

2 files changed

+36
-11
lines changed

include/rcutils/thread.h

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,31 @@ extern "C"
2323
{
2424
#endif
2525

26-
/// Enum for simple configuration of threads in two priority classes.
26+
/// Enum for OS independent thread priorities
2727
enum ThreadPriority
2828
{
2929
THREAD_PRIORITY_LOW,
30+
THREAD_PRIORITY_LOW_PLUS1,
31+
THREAD_PRIORITY_LOW_PLUS2,
32+
THREAD_PRIORITY_LOW_PLUS3,
33+
THREAD_PRIORITY_LOW_PLUS4,
34+
THREAD_PRIORITY_LOW_PLUS5,
35+
THREAD_PRIORITY_MEDIUM_MINUS5,
36+
THREAD_PRIORITY_MEDIUM_MINUS4,
37+
THREAD_PRIORITY_MEDIUM_MINUS3,
38+
THREAD_PRIORITY_MEDIUM_MINUS2,
39+
THREAD_PRIORITY_MEDIUM_MINUS1,
3040
THREAD_PRIORITY_MEDIUM,
41+
THREAD_PRIORITY_MEDIUM_PLUS1,
42+
THREAD_PRIORITY_MEDIUM_PLUS2,
43+
THREAD_PRIORITY_MEDIUM_PLUS3,
44+
THREAD_PRIORITY_MEDIUM_PLUS4,
45+
THREAD_PRIORITY_MEDIUM_PLUS5,
46+
THREAD_PRIORITY_HIGH_MINUS5,
47+
THREAD_PRIORITY_HIGH_MINUS4,
48+
THREAD_PRIORITY_HIGH_MINUS3,
49+
THREAD_PRIORITY_HIGH_MINUS2,
50+
THREAD_PRIORITY_HIGH_MINUS1,
3151
THREAD_PRIORITY_HIGH
3252
};
3353

src/thread.c

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,23 @@ rcutils_ret_t calculate_os_thread_priority(
4646
#elif __APPLE__
4747
return RCUTILS_RET_ERROR;
4848
#else
49-
if (thread_priority == THREAD_PRIORITY_HIGH) {
50-
*os_priority = sched_get_priority_max(SCHED_FIFO);
51-
} else if (thread_priority == THREAD_PRIORITY_LOW) {
52-
*os_priority = sched_get_priority_min(SCHED_FIFO);
53-
} else if (thread_priority == THREAD_PRIORITY_MEDIUM) {
54-
// Should be a value of 49 on standard Linux platforms, which is just below
55-
// the default priority of 50 for threaded interrupt handling.
56-
*os_priority =
57-
(sched_get_priority_min(SCHED_FIFO) + sched_get_priority_max(SCHED_FIFO)) / 2 - 1;
58-
} else { // unhandled priority
49+
if (thread_priority > THREAD_PRIORITY_HIGH || thread_priority < THREAD_PRIORITY_LOW) {
5950
return RCUTILS_RET_ERROR;
6051
}
52+
const int max_prio = sched_get_priority_max(SCHED_FIFO);
53+
const int min_prio = sched_get_priority_min(SCHED_FIFO);
54+
const int range_prio = max_prio - min_prio;
55+
56+
int priority = min_prio + (thread_priority - THREAD_PRIORITY_LOW) *
57+
range_prio / (THREAD_PRIORITY_HIGH - THREAD_PRIORITY_LOW);
58+
if (priority > min_prio && priority < max_prio) {
59+
// on Linux systems THREAD_PRIORITY_MEDIUM should be prio 49 instead of 50
60+
// in order to not block any interrupt handlers
61+
priority--;
62+
}
63+
64+
*os_priority = priority;
65+
6166
return RCUTILS_RET_OK;
6267
#endif
6368
}

0 commit comments

Comments
 (0)