diff packages/kernel/current/src/sched/mlqueue.cxx @ 128:0c2b7be0d798 ecos-sw-2000-10-12

Merge from eCos master repository on 2000-10-12-08:46:24-BST
author jlarmour
date Thu, 12 Oct 2000 20:31:43 +0000
parents 0ec04793409a
children 8f2f7615e727
line wrap: on
line diff
--- a/packages/kernel/current/src/sched/mlqueue.cxx
+++ b/packages/kernel/current/src/sched/mlqueue.cxx
@@ -276,20 +276,26 @@ Cyg_Scheduler_Implementation::timeslice(
         CYG_ASSERT( sched_lock > 0 , "Timeslice called with zero sched_lock");
 
         Cyg_Thread *thread = current_thread;
-        Cyg_Scheduler *sched = &Cyg_Scheduler::scheduler;
 
-        CYG_ASSERTCLASS( thread, "Bad current thread");
-        CYG_ASSERTCLASS( sched, "Bad scheduler");
+        // Only try to rotate the run queue if the current thread is running.
+        // Otherwise we are going to reschedule anyway.
+        if( thread->get_state() == Cyg_Thread::RUNNING )
+        {
+            Cyg_Scheduler *sched = &Cyg_Scheduler::scheduler;
+
+            CYG_ASSERTCLASS( thread, "Bad current thread");
+            CYG_ASSERTCLASS( sched, "Bad scheduler");
     
-        cyg_priority pri                               = thread->priority;
-        Cyg_SchedulerThreadQueue_Implementation *queue = &sched->run_queue[pri];
+            cyg_priority pri                               = thread->priority;
+            Cyg_SchedulerThreadQueue_Implementation *queue = &sched->run_queue[pri];
 
-        queue->rotate();
+            queue->rotate();
 
-        if( queue->highpri() != thread )
-            sched->need_reschedule = true;
+            if( queue->highpri() != thread )
+                sched->need_reschedule = true;
 
-        timeslice_count = CYGNUM_KERNEL_SCHED_TIMESLICE_TICKS;
+            timeslice_count = CYGNUM_KERNEL_SCHED_TIMESLICE_TICKS;
+        }
     }
 
     
@@ -656,7 +662,9 @@ void
 Cyg_ThreadQueue_Implementation::rotate(void)
 {
     CYG_REPORT_FUNCTION();
-        
+
+    CYG_ASSERT(queue != 0, "Rotating an empty queue");
+    
     queue = queue->next;
 
     CYG_REPORT_RETURN();