[haiku-commits] r34641 - haiku/trunk/src/system/kernel/scheduler

  • From: axeld@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 12 Dec 2009 16:02:30 +0100 (CET)

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


Other related posts:

  • » [haiku-commits] r34641 - haiku/trunk/src/system/kernel/scheduler - axeld