forked from Imagelibrary/rtems
score: Fix _Scheduler_Try_to_schedule_node() usage
Fix wrong use of continue statement in while loops.
This commit is contained in:
@@ -714,10 +714,11 @@ static inline Thread_Control *_Scheduler_SMP_Enqueue_scheduled_ordered(
|
|||||||
Scheduler_SMP_Allocate_processor allocate_processor
|
Scheduler_SMP_Allocate_processor allocate_processor
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
Thread_Control *needs_help;
|
while ( true ) {
|
||||||
|
Scheduler_Node *highest_ready;
|
||||||
|
Scheduler_Try_to_schedule_action action;
|
||||||
|
|
||||||
do {
|
highest_ready = ( *get_highest_ready )( context, node );
|
||||||
Scheduler_Node *highest_ready = ( *get_highest_ready )( context, node );
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The node has been extracted from the scheduled chain. We have to place
|
* The node has been extracted from the scheduled chain. We have to place
|
||||||
@@ -725,84 +726,77 @@ static inline Thread_Control *_Scheduler_SMP_Enqueue_scheduled_ordered(
|
|||||||
*/
|
*/
|
||||||
if ( ( *order )( &node->Node, &highest_ready->Node ) ) {
|
if ( ( *order )( &node->Node, &highest_ready->Node ) ) {
|
||||||
( *insert_scheduled )( context, node );
|
( *insert_scheduled )( context, node );
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
needs_help = NULL;
|
action = _Scheduler_Try_to_schedule_node(
|
||||||
} else {
|
context,
|
||||||
Scheduler_Try_to_schedule_action action;
|
highest_ready,
|
||||||
|
_Scheduler_Node_get_idle( node ),
|
||||||
|
_Scheduler_SMP_Get_idle_thread
|
||||||
|
);
|
||||||
|
|
||||||
action = _Scheduler_Try_to_schedule_node(
|
if ( action == SCHEDULER_TRY_TO_SCHEDULE_DO_SCHEDULE ) {
|
||||||
|
Thread_Control *user = _Scheduler_Node_get_user( node );
|
||||||
|
Thread_Control *idle;
|
||||||
|
|
||||||
|
_Scheduler_SMP_Node_change_state(
|
||||||
|
_Scheduler_SMP_Node_downcast( node ),
|
||||||
|
SCHEDULER_SMP_NODE_READY
|
||||||
|
);
|
||||||
|
_Scheduler_Thread_change_state( user, THREAD_SCHEDULER_READY );
|
||||||
|
|
||||||
|
_Scheduler_SMP_Allocate_processor(
|
||||||
context,
|
context,
|
||||||
highest_ready,
|
highest_ready,
|
||||||
_Scheduler_Node_get_idle( node ),
|
node,
|
||||||
_Scheduler_SMP_Get_idle_thread
|
allocate_processor
|
||||||
);
|
);
|
||||||
|
|
||||||
if ( action == SCHEDULER_TRY_TO_SCHEDULE_DO_SCHEDULE ) {
|
( *insert_ready )( context, node );
|
||||||
Thread_Control *user = _Scheduler_Node_get_user( node );
|
( *move_from_ready_to_scheduled )( context, highest_ready );
|
||||||
Thread_Control *idle;
|
|
||||||
|
|
||||||
_Scheduler_SMP_Node_change_state(
|
idle = _Scheduler_Release_idle_thread(
|
||||||
_Scheduler_SMP_Node_downcast( node ),
|
context,
|
||||||
SCHEDULER_SMP_NODE_READY
|
node,
|
||||||
);
|
_Scheduler_SMP_Release_idle_thread
|
||||||
_Scheduler_Thread_change_state( user, THREAD_SCHEDULER_READY );
|
);
|
||||||
|
|
||||||
_Scheduler_SMP_Allocate_processor(
|
if ( idle == NULL ) {
|
||||||
context,
|
return user;
|
||||||
highest_ready,
|
|
||||||
node,
|
|
||||||
allocate_processor
|
|
||||||
);
|
|
||||||
|
|
||||||
( *insert_ready )( context, node );
|
|
||||||
( *move_from_ready_to_scheduled )( context, highest_ready );
|
|
||||||
|
|
||||||
idle = _Scheduler_Release_idle_thread(
|
|
||||||
context,
|
|
||||||
node,
|
|
||||||
_Scheduler_SMP_Release_idle_thread
|
|
||||||
);
|
|
||||||
if ( idle == NULL ) {
|
|
||||||
needs_help = user;
|
|
||||||
} else {
|
|
||||||
needs_help = NULL;
|
|
||||||
}
|
|
||||||
} else if ( action == SCHEDULER_TRY_TO_SCHEDULE_DO_IDLE_EXCHANGE ) {
|
|
||||||
_Scheduler_SMP_Node_change_state(
|
|
||||||
_Scheduler_SMP_Node_downcast( node ),
|
|
||||||
SCHEDULER_SMP_NODE_READY
|
|
||||||
);
|
|
||||||
_Scheduler_SMP_Node_change_state(
|
|
||||||
_Scheduler_SMP_Node_downcast( highest_ready ),
|
|
||||||
SCHEDULER_SMP_NODE_SCHEDULED
|
|
||||||
);
|
|
||||||
|
|
||||||
( *insert_ready )( context, node );
|
|
||||||
( *move_from_ready_to_scheduled )( context, highest_ready );
|
|
||||||
|
|
||||||
_Scheduler_Exchange_idle_thread(
|
|
||||||
highest_ready,
|
|
||||||
node,
|
|
||||||
_Scheduler_Node_get_idle( node )
|
|
||||||
);
|
|
||||||
|
|
||||||
needs_help = NULL;
|
|
||||||
} else {
|
} else {
|
||||||
_Assert( action == SCHEDULER_TRY_TO_SCHEDULE_DO_BLOCK );
|
return NULL;
|
||||||
|
|
||||||
_Scheduler_SMP_Node_change_state(
|
|
||||||
_Scheduler_SMP_Node_downcast( highest_ready ),
|
|
||||||
SCHEDULER_SMP_NODE_BLOCKED
|
|
||||||
);
|
|
||||||
|
|
||||||
( *extract_from_ready )( context, highest_ready );
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
} else if ( action == SCHEDULER_TRY_TO_SCHEDULE_DO_IDLE_EXCHANGE ) {
|
||||||
} while ( false );
|
_Scheduler_SMP_Node_change_state(
|
||||||
|
_Scheduler_SMP_Node_downcast( node ),
|
||||||
|
SCHEDULER_SMP_NODE_READY
|
||||||
|
);
|
||||||
|
_Scheduler_SMP_Node_change_state(
|
||||||
|
_Scheduler_SMP_Node_downcast( highest_ready ),
|
||||||
|
SCHEDULER_SMP_NODE_SCHEDULED
|
||||||
|
);
|
||||||
|
|
||||||
return needs_help;
|
( *insert_ready )( context, node );
|
||||||
|
( *move_from_ready_to_scheduled )( context, highest_ready );
|
||||||
|
|
||||||
|
_Scheduler_Exchange_idle_thread(
|
||||||
|
highest_ready,
|
||||||
|
node,
|
||||||
|
_Scheduler_Node_get_idle( node )
|
||||||
|
);
|
||||||
|
return NULL;
|
||||||
|
} else {
|
||||||
|
_Assert( action == SCHEDULER_TRY_TO_SCHEDULE_DO_BLOCK );
|
||||||
|
|
||||||
|
_Scheduler_SMP_Node_change_state(
|
||||||
|
_Scheduler_SMP_Node_downcast( highest_ready ),
|
||||||
|
SCHEDULER_SMP_NODE_BLOCKED
|
||||||
|
);
|
||||||
|
|
||||||
|
( *extract_from_ready )( context, highest_ready );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void _Scheduler_SMP_Extract_from_scheduled(
|
static inline void _Scheduler_SMP_Extract_from_scheduled(
|
||||||
@@ -821,9 +815,10 @@ static inline void _Scheduler_SMP_Schedule_highest_ready(
|
|||||||
Scheduler_SMP_Allocate_processor allocate_processor
|
Scheduler_SMP_Allocate_processor allocate_processor
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
Scheduler_Try_to_schedule_action action;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
Scheduler_Node *highest_ready = ( *get_highest_ready )( context, victim );
|
Scheduler_Node *highest_ready = ( *get_highest_ready )( context, victim );
|
||||||
Scheduler_Try_to_schedule_action action;
|
|
||||||
|
|
||||||
action = _Scheduler_Try_to_schedule_node(
|
action = _Scheduler_Try_to_schedule_node(
|
||||||
context,
|
context,
|
||||||
@@ -850,10 +845,8 @@ static inline void _Scheduler_SMP_Schedule_highest_ready(
|
|||||||
);
|
);
|
||||||
|
|
||||||
( *extract_from_ready )( context, highest_ready );
|
( *extract_from_ready )( context, highest_ready );
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
} while ( false );
|
} while ( action == SCHEDULER_TRY_TO_SCHEDULE_DO_BLOCK );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user