Mercurial > ecos
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();
