Author: axeld Date: 2009-12-12 16:02:30 +0100 (Sat, 12 Dec 2009) New Revision: 34641 Changeset: http://dev.haiku-os.org/changeset/34641/haiku Modified: haiku/trunk/src/system/kernel/scheduler/scheduler_simple.cpp haiku/trunk/src/system/kernel/scheduler/scheduler_simple_smp.cpp Log: * Applied r34634 to the simple SMP scheduler as well (Rene was right, I just overlooked it). Modified: haiku/trunk/src/system/kernel/scheduler/scheduler_simple.cpp =================================================================== --- haiku/trunk/src/system/kernel/scheduler/scheduler_simple.cpp 2009-12-12 12:31:24 UTC (rev 34640) +++ haiku/trunk/src/system/kernel/scheduler/scheduler_simple.cpp 2009-12-12 15:02:30 UTC (rev 34641) @@ -8,6 +8,7 @@ * Distributed under the terms of the NewOS License. */ + /*! The thread scheduler */ Modified: haiku/trunk/src/system/kernel/scheduler/scheduler_simple_smp.cpp =================================================================== --- haiku/trunk/src/system/kernel/scheduler/scheduler_simple_smp.cpp 2009-12-12 12:31:24 UTC (rev 34640) +++ haiku/trunk/src/system/kernel/scheduler/scheduler_simple_smp.cpp 2009-12-12 15:02:30 UTC (rev 34641) @@ -1,6 +1,6 @@ /* * Copyright 2008-2009, Ingo Weinhold, ingo_weinhold@xxxxxxx - * Copyright 2002-2007, Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx + * Copyright 2002-2009, Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx * Copyright 2002, Angelo Mottola, a.mottola@xxxxxxxxxx * Distributed under the terms of the MIT License. * @@ -8,6 +8,7 @@ * Distributed under the terms of the NewOS License. */ + /*! The thread scheduler */ @@ -336,22 +337,32 @@ if (nextThread->priority >= B_FIRST_REAL_TIME_PRIORITY) break; + // find next thread with lower priority + struct thread *lowerNextThread = nextThread->queue_next; + struct thread *lowerPrevThread = nextThread; + int32 priority = nextThread->priority; + + while (lowerNextThread != NULL + && priority == lowerNextThread->priority) { + lowerPrevThread = lowerNextThread; + lowerNextThread = lowerNextThread->queue_next; + } // never skip last non-idle normal thread - if (nextThread->queue_next && nextThread->queue_next->priority == B_IDLE_PRIORITY) + if (lowerNextThread == NULL + || lowerNextThread->priority == B_IDLE_PRIORITY) break; - // skip normal threads sometimes (roughly 20%) - if (_rand() > 0x1a00) + int32 priorityDiff = priority - lowerNextThread->priority; + if (priorityDiff > 15) break; - // skip until next lower priority - int32 priority = nextThread->priority; - do { - prevThread = nextThread; - nextThread = nextThread->queue_next; - } while (nextThread->queue_next != NULL - && priority == nextThread->queue_next->priority - && nextThread->queue_next->priority > B_IDLE_PRIORITY); + // skip normal threads sometimes + // (twice as probable per priority level) + if ((_rand() >> (15 - priorityDiff)) != 0) + break; + + nextThread = lowerNextThread; + prevThread = lowerPrevThread; } if (nextThread->cpu