diff packages/kernel/current/src/sched/mlqueue.cxx @ 124:0ec04793409a ecos-sw-2000-09-11

Merge from eCos master repository on 2000-09-11-03:00:13-BST
author jlarmour
date Mon, 11 Sep 2000 02:42:46 +0000
parents 6ed91473a1cd
children 0c2b7be0d798
line wrap: on
line diff
--- a/packages/kernel/current/src/sched/mlqueue.cxx
+++ b/packages/kernel/current/src/sched/mlqueue.cxx
@@ -135,8 +135,8 @@ Cyg_Scheduler_Implementation::add_thread
     CYG_REPORT_FUNCTION();
     CYG_REPORT_FUNCARG1("thread=%08x", thread);
 
-    cyg_priority pri                            = thread->priority;
-    Cyg_ThreadQueue_Implementation *queue       = &run_queue[pri];
+    cyg_priority pri                               = thread->priority;
+    Cyg_SchedulerThreadQueue_Implementation *queue = &run_queue[pri];
 
     CYG_ASSERT((CYG_THREAD_MIN_PRIORITY >= pri) 
                && (CYG_THREAD_MAX_PRIORITY <= pri),
@@ -186,8 +186,8 @@ Cyg_Scheduler_Implementation::rem_thread
         
     CYG_ASSERT( queue_map != 0, "Run queue empty");
       
-    cyg_priority pri                            = thread->priority;
-    Cyg_ThreadQueue_Implementation *queue       = &run_queue[pri];
+    cyg_priority pri                               = thread->priority;
+    Cyg_SchedulerThreadQueue_Implementation *queue = &run_queue[pri];
 
     CYG_ASSERT( pri != CYG_THREAD_MIN_PRIORITY, "Idle thread trying to sleep!");
     CYG_ASSERT( queue_map & (1<<pri), "Queue map bit not set for pri");
@@ -272,8 +272,24 @@ Cyg_Scheduler_Implementation::timeslice(
 #ifdef CYGDBG_KERNEL_TRACE_TIMESLICE
         CYG_TRACE0( true, "quantum consumed, time to reschedule" );
 #endif
-        // And force the current thread to yield.
-        current_thread->yield();
+
+        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");
+    
+        cyg_priority pri                               = thread->priority;
+        Cyg_SchedulerThreadQueue_Implementation *queue = &sched->run_queue[pri];
+
+        queue->rotate();
+
+        if( queue->highpri() != thread )
+            sched->need_reschedule = true;
+
+        timeslice_count = CYGNUM_KERNEL_SCHED_TIMESLICE_TICKS;
     }
 
     
@@ -377,8 +393,8 @@ Cyg_SchedThread_Implementation::yield(vo
 
         CYG_ASSERTCLASS( sched, "Bad scheduler");
     
-        cyg_priority pri                            = thread->priority;
-        Cyg_ThreadQueue_Implementation *queue       = &sched->run_queue[pri];
+        cyg_priority pri                               = thread->priority;
+        Cyg_SchedulerThreadQueue_Implementation *queue = &sched->run_queue[pri];
 
         queue->rotate();
 
@@ -392,8 +408,16 @@ Cyg_SchedThread_Implementation::yield(vo
     }
     
     // Unlock the scheduler and switch threads
-    Cyg_Scheduler::unlock();
+#ifdef CYGDBG_USE_ASSERTS
+    // This test keeps the assertions in unlock_inner() happy if
+    // need_reschedule was not set above.
+    if( !Cyg_Scheduler::need_reschedule )
+        Cyg_Scheduler::unlock();
+    else 
+#endif    
+    Cyg_Scheduler::unlock_reschedule();
 
+    
     CYG_REPORT_RETURN();
 }
 
@@ -414,7 +438,7 @@ Cyg_SchedThread_Implementation::rotate_q
 
     CYG_ASSERTCLASS( sched, "Bad scheduler");
     
-    Cyg_ThreadQueue_Implementation *queue = &sched->run_queue[pri];
+    Cyg_SchedulerThreadQueue_Implementation *queue = &sched->run_queue[pri];
 
     if ( !queue->empty() ) {
         queue->rotate();