diff options
Diffstat (limited to 'cpukit/score/include/rtems/score/schedulerimpl.h')
-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; } |