diff options
Diffstat (limited to 'cpukit/score/src')
-rw-r--r-- | cpukit/score/src/schedulerdefaulttick.c | 4 | ||||
-rw-r--r-- | cpukit/score/src/scheduleredfyield.c | 7 | ||||
-rw-r--r-- | cpukit/score/src/schedulerprioritysmp.c | 14 | ||||
-rw-r--r-- | cpukit/score/src/schedulerpriorityyield.c | 23 | ||||
-rw-r--r-- | cpukit/score/src/schedulersimplesmp.c | 14 | ||||
-rw-r--r-- | cpukit/score/src/schedulersimpleyield.c | 15 | ||||
-rw-r--r-- | cpukit/score/src/threadyield.c | 41 |
7 files changed, 70 insertions, 48 deletions
diff --git a/cpukit/score/src/schedulerdefaulttick.c b/cpukit/score/src/schedulerdefaulttick.c index 98cd05e1c0..db67ca1508 100644 --- a/cpukit/score/src/schedulerdefaulttick.c +++ b/cpukit/score/src/schedulerdefaulttick.c @@ -29,6 +29,8 @@ void _Scheduler_default_Tick( Thread_Control *executing ) { + (void) scheduler; + #ifdef __RTEMS_USE_TICKS_FOR_STATISTICS__ /* * Increment the number of ticks this thread has been executing @@ -69,7 +71,7 @@ void _Scheduler_default_Tick( * currently executing thread is placed at the rear of the * FIFO for this priority and a new heir is selected. */ - _Scheduler_Yield( scheduler, executing ); + _Thread_Yield( executing ); executing->cpu_time_budget = rtems_configuration_get_ticks_per_timeslice(); } diff --git a/cpukit/score/src/scheduleredfyield.c b/cpukit/score/src/scheduleredfyield.c index 9eb07825fe..d43448becf 100644 --- a/cpukit/score/src/scheduleredfyield.c +++ b/cpukit/score/src/scheduleredfyield.c @@ -29,9 +29,6 @@ void _Scheduler_EDF_Yield( Scheduler_EDF_Context *context = _Scheduler_EDF_Get_context( scheduler ); Scheduler_EDF_Node *node = _Scheduler_EDF_Node_get( the_thread ); - ISR_Level level; - - _ISR_Disable( level ); /* * The RBTree has more than one node, enqueue behind the tasks @@ -40,9 +37,5 @@ void _Scheduler_EDF_Yield( _RBTree_Extract( &context->Ready, &node->Node ); _RBTree_Insert( &context->Ready, &node->Node ); - _ISR_Flash( level ); - _Scheduler_EDF_Schedule_body( scheduler, the_thread, false ); - - _ISR_Enable( level ); } diff --git a/cpukit/score/src/schedulerprioritysmp.c b/cpukit/score/src/schedulerprioritysmp.c index 96b1689f37..bcbd26df3f 100644 --- a/cpukit/score/src/schedulerprioritysmp.c +++ b/cpukit/score/src/schedulerprioritysmp.c @@ -237,12 +237,12 @@ void _Scheduler_priority_SMP_Yield( ) { Scheduler_Context *context = _Scheduler_Get_context( scheduler ); - ISR_Level level; - _ISR_Disable( level ); - - _Scheduler_SMP_Extract_from_scheduled( thread ); - _Scheduler_priority_SMP_Enqueue_scheduled_fifo( context, thread ); - - _ISR_Enable( level ); + return _Scheduler_SMP_Yield( + context, + thread, + _Scheduler_priority_SMP_Extract_from_ready, + _Scheduler_priority_SMP_Enqueue_fifo, + _Scheduler_priority_SMP_Enqueue_scheduled_fifo + ); } diff --git a/cpukit/score/src/schedulerpriorityyield.c b/cpukit/score/src/schedulerpriorityyield.c index f2aeada660..60bab3983e 100644 --- a/cpukit/score/src/schedulerpriorityyield.c +++ b/cpukit/score/src/schedulerpriorityyield.c @@ -19,7 +19,6 @@ #endif #include <rtems/score/schedulerpriorityimpl.h> -#include <rtems/score/isr.h> #include <rtems/score/threadimpl.h> void _Scheduler_priority_Yield( @@ -29,23 +28,19 @@ void _Scheduler_priority_Yield( { Scheduler_priority_Node *node = _Scheduler_priority_Node_get( the_thread ); Chain_Control *ready_chain = node->Ready_queue.ready_chain; - ISR_Level level; (void) scheduler; - _ISR_Disable( level ); - if ( !_Chain_Has_only_one_node( ready_chain ) ) { - _Chain_Extract_unprotected( &the_thread->Object.Node ); - _Chain_Append_unprotected( ready_chain, &the_thread->Object.Node ); + if ( !_Chain_Has_only_one_node( ready_chain ) ) { + _Chain_Extract_unprotected( &the_thread->Object.Node ); + _Chain_Append_unprotected( ready_chain, &the_thread->Object.Node ); - _ISR_Flash( level ); - - if ( _Thread_Is_heir( the_thread ) ) - _Thread_Heir = (Thread_Control *) _Chain_First( ready_chain ); - _Thread_Dispatch_necessary = true; + if ( _Thread_Is_heir( the_thread ) ) { + _Thread_Heir = (Thread_Control *) _Chain_First( ready_chain ); } - else if ( !_Thread_Is_heir( the_thread ) ) - _Thread_Dispatch_necessary = true; - _ISR_Enable( level ); + _Thread_Dispatch_necessary = true; + } else if ( !_Thread_Is_heir( the_thread ) ) { + _Thread_Dispatch_necessary = true; + } } diff --git a/cpukit/score/src/schedulersimplesmp.c b/cpukit/score/src/schedulersimplesmp.c index eb260efd09..37458d6b6f 100644 --- a/cpukit/score/src/schedulersimplesmp.c +++ b/cpukit/score/src/schedulersimplesmp.c @@ -302,12 +302,12 @@ void _Scheduler_simple_SMP_Yield( ) { Scheduler_Context *context = _Scheduler_Get_context( scheduler ); - ISR_Level level; - _ISR_Disable( level ); - - _Scheduler_SMP_Extract_from_scheduled( thread ); - _Scheduler_simple_SMP_Enqueue_scheduled_fifo( context, thread ); - - _ISR_Enable( level ); + return _Scheduler_SMP_Yield( + context, + thread, + _Scheduler_simple_SMP_Extract_from_ready, + _Scheduler_simple_SMP_Enqueue_fifo, + _Scheduler_simple_SMP_Enqueue_scheduled_fifo + ); } diff --git a/cpukit/score/src/schedulersimpleyield.c b/cpukit/score/src/schedulersimpleyield.c index 65578d0bbb..b807530600 100644 --- a/cpukit/score/src/schedulersimpleyield.c +++ b/cpukit/score/src/schedulersimpleyield.c @@ -19,7 +19,6 @@ #endif #include <rtems/score/schedulersimpleimpl.h> -#include <rtems/score/isr.h> void _Scheduler_simple_Yield( const Scheduler_Control *scheduler, @@ -28,16 +27,8 @@ void _Scheduler_simple_Yield( { Scheduler_simple_Context *context = _Scheduler_simple_Get_context( scheduler ); - ISR_Level level; - _ISR_Disable( level ); - - _Chain_Extract_unprotected( &the_thread->Object.Node ); - _Scheduler_simple_Insert_priority_fifo( &context->Ready, the_thread ); - - _ISR_Flash( level ); - - _Scheduler_simple_Schedule_body( scheduler, the_thread, false ); - - _ISR_Enable( level ); + _Chain_Extract_unprotected( &the_thread->Object.Node ); + _Scheduler_simple_Insert_priority_fifo( &context->Ready, the_thread ); + _Scheduler_simple_Schedule_body( scheduler, the_thread, false ); } diff --git a/cpukit/score/src/threadyield.c b/cpukit/score/src/threadyield.c new file mode 100644 index 0000000000..b49e2b30ba --- /dev/null +++ b/cpukit/score/src/threadyield.c @@ -0,0 +1,41 @@ +/** + * @file + * + * @brief Thread Yield + * + * @ingroup ScoreThread + */ + +/* + * Copyright (c) 2014 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * <rtems@embedded-brains.de> + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#if HAVE_CONFIG_H + #include "config.h" +#endif + +#include <rtems/score/threadimpl.h> +#include <rtems/score/schedulerimpl.h> + +void _Thread_Yield( Thread_Control *executing ) +{ + ISR_Level level; + + _ISR_Disable( level ); + + if ( _States_Is_ready( executing->current_state ) ) { + _Scheduler_Yield( _Scheduler_Get( executing ), executing ); + } + + _ISR_Enable( level ); +} |