diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-11-04 08:29:43 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-11-04 08:34:11 +0100 |
commit | 76ad5e0c4491ae1e2b93bc67a934661b195fdcce (patch) | |
tree | 0ce7a009e2a6129f05c8b8998a751011deab46b8 | |
parent | virtex4, virtex5 bsp.h: Use BSP_INTERRUPT_STACK_SIZE not user space CONFIGURE... (diff) | |
download | rtems-76ad5e0c4491ae1e2b93bc67a934661b195fdcce.tar.bz2 |
score: Fix _Scheduler_Try_to_schedule_node()
In case the thread is scheduled and the sticky level is greater than
one, then we must use an idle thread for correctness of MrsP.
-rw-r--r-- | cpukit/score/include/rtems/score/schedulerimpl.h | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h b/cpukit/score/include/rtems/score/schedulerimpl.h index 8ecabf7ab1..0abc1a074c 100644 --- a/cpukit/score/include/rtems/score/schedulerimpl.h +++ b/cpukit/score/include/rtems/score/schedulerimpl.h @@ -973,33 +973,37 @@ _Scheduler_Try_to_schedule_node( { ISR_lock_Context lock_context; Scheduler_Try_to_schedule_action action; - Thread_Control *user; + Thread_Control *owner; action = SCHEDULER_TRY_TO_SCHEDULE_DO_SCHEDULE; - user = _Scheduler_Node_get_user( node ); + owner = _Scheduler_Node_get_owner( node ); + _Assert( _Scheduler_Node_get_user( node ) == owner ); + _Assert( _Scheduler_Node_get_idle( node ) == NULL ); - _Thread_Scheduler_acquire_critical( user, &lock_context ); + _Thread_Scheduler_acquire_critical( owner, &lock_context ); - if ( user->Scheduler.state == THREAD_SCHEDULER_READY ) { - _Thread_Scheduler_cancel_need_for_help( user, _Thread_Get_CPU( user ) ); - _Scheduler_Thread_change_state( user, THREAD_SCHEDULER_SCHEDULED ); + if ( owner->Scheduler.state == THREAD_SCHEDULER_READY ) { + _Thread_Scheduler_cancel_need_for_help( owner, _Thread_Get_CPU( owner ) ); + _Scheduler_Thread_change_state( owner, THREAD_SCHEDULER_SCHEDULED ); } else if ( - user->Scheduler.state == THREAD_SCHEDULER_SCHEDULED - || node->sticky_level == 0 + owner->Scheduler.state == THREAD_SCHEDULER_SCHEDULED + && node->sticky_level <= 1 ) { action = SCHEDULER_TRY_TO_SCHEDULE_DO_BLOCK; + } else if ( node->sticky_level == 0 ) { + action = SCHEDULER_TRY_TO_SCHEDULE_DO_BLOCK; } else if ( idle != NULL ) { action = SCHEDULER_TRY_TO_SCHEDULE_DO_IDLE_EXCHANGE; } else { _Scheduler_Use_idle_thread( context, node, - _Thread_Get_CPU( user ), + _Thread_Get_CPU( owner ), get_idle_thread ); } - _Thread_Scheduler_release_critical( user, &lock_context ); + _Thread_Scheduler_release_critical( owner, &lock_context ); return action; } |