summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-11-04 08:29:43 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-11-04 08:34:11 +0100
commit76ad5e0c4491ae1e2b93bc67a934661b195fdcce (patch)
tree0ce7a009e2a6129f05c8b8998a751011deab46b8
parentvirtex4, virtex5 bsp.h: Use BSP_INTERRUPT_STACK_SIZE not user space CONFIGURE... (diff)
downloadrtems-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.h24
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;
}