From db1ddabfd0121c18ab9d87e2047c6ff6e4d29653 Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Tue, 31 Dec 2013 04:48:23 +0100 Subject: [PATCH] scheduler: Thread can not stay on CPU if it has been disabled --- src/system/kernel/scheduler/scheduler.cpp | 8 +++----- src/system/kernel/scheduler/scheduler_thread.cpp | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/system/kernel/scheduler/scheduler.cpp b/src/system/kernel/scheduler/scheduler.cpp index fc941b34fd..41546f05da 100644 --- a/src/system/kernel/scheduler/scheduler.cpp +++ b/src/system/kernel/scheduler/scheduler.cpp @@ -532,6 +532,9 @@ reschedule(int32 nextState) } Thread* nextThread = nextThreadData->GetThread(); + ASSERT(!gCPU[thisCPU].disabled || thread_is_idle_thread(nextThread)); + + // update CPU heap CoreCPUHeapLocker cpuLocker(core); cpu->UpdatePriority(nextThreadData->GetEffectivePriority()); cpuLocker.Unlock(); @@ -559,11 +562,6 @@ reschedule(int32 nextState) ASSERT(nextThreadData->Core() == core); nextThread->state = B_THREAD_RUNNING; - // update CPU heap - cpuLocker.Lock(); - cpu->UpdatePriority(nextThreadData->GetEffectivePriority()); - cpuLocker.Unlock(); - // track kernel time (user time is tracked in thread_at_kernel_entry()) update_thread_times(oldThread, nextThread); diff --git a/src/system/kernel/scheduler/scheduler_thread.cpp b/src/system/kernel/scheduler/scheduler_thread.cpp index 9f5d834d0b..4d5ea1909b 100644 --- a/src/system/kernel/scheduler/scheduler_thread.cpp +++ b/src/system/kernel/scheduler/scheduler_thread.cpp @@ -210,7 +210,7 @@ ThreadData::_ChooseCPU(CoreEntry* core, bool& rescheduleNeeded) const if (fThread->previous_cpu != NULL) { CPUEntry* previousCPU = &gCPUEntries[fThread->previous_cpu->cpu_num]; - if (previousCPU->Core() == core) { + if (previousCPU->Core() == core && !fThread->previous_cpu->disabled) { CoreCPUHeapLocker _(core); if (CPUPriorityHeap::GetKey(previousCPU) < threadPriority) { previousCPU->UpdatePriority(threadPriority);