Skip to content

Commit 0606b35

Browse files
Fix MSVC switch cases and scope pool priority elevation.
Qualify PriorityLevel cases for Windows and switch on priority() for portability; limit HIGHEST thread priority to dequeue so ChronoController is not starved on macOS. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 2370255 commit 0606b35

2 files changed

Lines changed: 17 additions & 14 deletions

File tree

‎src/threading/scheduler/Pool.cpp‎

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -289,11 +289,14 @@ namespace threading {
289289
consumer_thread_id = std::this_thread::get_id();
290290
Pool::current_pool = this;
291291
try {
292-
// Set the thread priority to highest while getting tasks
293-
// This means that this thread will be a FIFO queued task on linux so it won't timeslice
294-
const util::ThreadPriority priority_lock(PriorityLevel::HIGHEST);
295292
while (true) {
296-
Task task = get_task();
293+
Task task;
294+
{
295+
// Elevate priority only while dequeuing so Linux workers stay FIFO-scheduled
296+
// without starving other pools (e.g. ChronoController's Always thread).
297+
const util::ThreadPriority priority_lock(PriorityLevel::HIGHEST);
298+
task = get_task();
299+
}
297300
task.task->run();
298301
}
299302
}

‎src/util/ThreadPriority.cpp‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,15 @@ namespace util {
3232

3333
void set_current_thread_priority(const PriorityLevel& priority) noexcept {
3434

35-
switch (priority) {
36-
case IDLE: SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_IDLE); break;
37-
case LOWEST: SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); break;
38-
case LOW: SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL); break;
35+
switch (priority()) {
36+
case PriorityLevel::IDLE: SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_IDLE); break;
37+
case PriorityLevel::LOWEST: SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); break;
38+
case PriorityLevel::LOW: SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL); break;
3939
default: // Default to normal if someone broke the enum
40-
case NORMAL: SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL); break;
41-
case HIGH: SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL); break;
42-
case HIGHEST: SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); break;
43-
case REALTIME: SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); break;
40+
case PriorityLevel::NORMAL: SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL); break;
41+
case PriorityLevel::HIGH: SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL); break;
42+
case PriorityLevel::HIGHEST: SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); break;
43+
case PriorityLevel::REALTIME: SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); break;
4444
}
4545
}
4646

@@ -123,7 +123,7 @@ namespace util {
123123

124124
void set_current_thread_priority(const PriorityLevel& priority) noexcept {
125125
sched_param param{};
126-
switch (priority) {
126+
switch (priority()) {
127127
case PriorityLevel::IDLE:
128128
param.sched_priority = min_rr_priority + 0 * step_rr_priority;
129129
pthread_setschedparam(pthread_self(), SCHED_RR, &param);
@@ -182,7 +182,7 @@ namespace util {
182182
}
183183

184184
void set_current_thread_priority(const PriorityLevel& priority) noexcept {
185-
switch (priority) {
185+
switch (priority()) {
186186
case PriorityLevel::IDLE: pthread_set_qos_class_self_np(QOS_CLASS_BACKGROUND, 0); break;
187187
case PriorityLevel::LOWEST: pthread_set_qos_class_self_np(QOS_CLASS_UTILITY, 0); break;
188188
case PriorityLevel::LOW: pthread_set_qos_class_self_np(QOS_CLASS_UTILITY, -1); break;

0 commit comments

Comments
 (0)