From 6eba7c857b9e72bc4ed8e55f0c9538c45631484f Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 10 Jun 2013 16:15:46 +0200 Subject: scheduler: Specify thread of yield operation The yielding thread of the yield operation is now specified by a parameter. The tick operation may be performed for each executing thread in a SMP configuration. --- cpukit/score/src/scheduleredfyield.c | 13 ++++++------- cpukit/score/src/schedulerprioritytick.c | 2 +- cpukit/score/src/schedulerpriorityyield.c | 14 ++++++-------- cpukit/score/src/schedulersimpleyield.c | 8 +++----- 4 files changed, 16 insertions(+), 21 deletions(-) (limited to 'cpukit/score/src') diff --git a/cpukit/score/src/scheduleredfyield.c b/cpukit/score/src/scheduleredfyield.c index d6862540a0..4ba9f79b77 100644 --- a/cpukit/score/src/scheduleredfyield.c +++ b/cpukit/score/src/scheduleredfyield.c @@ -25,14 +25,13 @@ #include #include -void _Scheduler_EDF_Yield(void) +void _Scheduler_EDF_Yield( Thread_Control *thread ) { ISR_Level level; - Thread_Control *executing = _Thread_Executing; - Scheduler_EDF_Per_thread *executing_info = - (Scheduler_EDF_Per_thread *) executing->scheduler_info; - RBTree_Node *executing_node = &(executing_info->Node); + Scheduler_EDF_Per_thread *thread_info = + (Scheduler_EDF_Per_thread *) thread->scheduler_info; + RBTree_Node *thread_node = &(thread_info->Node); _ISR_Disable( level ); @@ -40,8 +39,8 @@ void _Scheduler_EDF_Yield(void) * The RBTree has more than one node, enqueue behind the tasks * with the same priority in case there are such ones. */ - _RBTree_Extract( &_Scheduler_EDF_Ready_queue, executing_node ); - _RBTree_Insert( &_Scheduler_EDF_Ready_queue, executing_node ); + _RBTree_Extract( &_Scheduler_EDF_Ready_queue, thread_node ); + _RBTree_Insert( &_Scheduler_EDF_Ready_queue, thread_node ); _ISR_Flash( level ); diff --git a/cpukit/score/src/schedulerprioritytick.c b/cpukit/score/src/schedulerprioritytick.c index afe6c76d34..7ce3efdb3a 100644 --- a/cpukit/score/src/schedulerprioritytick.c +++ b/cpukit/score/src/schedulerprioritytick.c @@ -68,7 +68,7 @@ void _Scheduler_priority_Tick( void ) * currently executing thread is placed at the rear of the * FIFO for this priority and a new heir is selected. */ - _Scheduler_Yield(); + _Scheduler_Yield( executing ); executing->cpu_time_budget = _Thread_Ticks_per_timeslice; } break; diff --git a/cpukit/score/src/schedulerpriorityyield.c b/cpukit/score/src/schedulerpriorityyield.c index c000125daf..4c2b5996c1 100644 --- a/cpukit/score/src/schedulerpriorityyield.c +++ b/cpukit/score/src/schedulerpriorityyield.c @@ -24,28 +24,26 @@ #include #include -void _Scheduler_priority_Yield(void) +void _Scheduler_priority_Yield( Thread_Control *thread ) { Scheduler_priority_Per_thread *sched_info; ISR_Level level; - Thread_Control *executing; Chain_Control *ready; - executing = _Thread_Executing; - sched_info = (Scheduler_priority_Per_thread *) executing->scheduler_info; + sched_info = (Scheduler_priority_Per_thread *) thread->scheduler_info; ready = sched_info->ready_chain; _ISR_Disable( level ); if ( !_Chain_Has_only_one_node( ready ) ) { - _Chain_Extract_unprotected( &executing->Object.Node ); - _Chain_Append_unprotected( ready, &executing->Object.Node ); + _Chain_Extract_unprotected( &thread->Object.Node ); + _Chain_Append_unprotected( ready, &thread->Object.Node ); _ISR_Flash( level ); - if ( _Thread_Is_heir( executing ) ) + if ( _Thread_Is_heir( thread ) ) _Thread_Heir = (Thread_Control *) _Chain_First( ready ); _Thread_Dispatch_necessary = true; } - else if ( !_Thread_Is_heir( executing ) ) + else if ( !_Thread_Is_heir( thread ) ) _Thread_Dispatch_necessary = true; _ISR_Enable( level ); diff --git a/cpukit/score/src/schedulersimpleyield.c b/cpukit/score/src/schedulersimpleyield.c index 1d5d48c7e5..cfbe7a4cba 100644 --- a/cpukit/score/src/schedulersimpleyield.c +++ b/cpukit/score/src/schedulersimpleyield.c @@ -24,21 +24,19 @@ #include #include -void _Scheduler_simple_Yield( void ) +void _Scheduler_simple_Yield( Thread_Control *thread ) { ISR_Level level; - Thread_Control *executing; - executing = _Thread_Executing; _ISR_Disable( level ); - _Scheduler_simple_Ready_queue_requeue(&_Scheduler, executing); + _Scheduler_simple_Ready_queue_requeue( &_Scheduler, thread ); _ISR_Flash( level ); _Scheduler_simple_Schedule(); - if ( !_Thread_Is_heir( executing ) ) + if ( !_Thread_Is_heir( thread ) ) _Thread_Dispatch_necessary = true; _ISR_Enable( level ); -- cgit v1.2.3