diff options
Diffstat (limited to 'cpukit/score/include/rtems/score/schedulersmpimpl.h')
-rw-r--r-- | cpukit/score/include/rtems/score/schedulersmpimpl.h | 82 |
1 files changed, 54 insertions, 28 deletions
diff --git a/cpukit/score/include/rtems/score/schedulersmpimpl.h b/cpukit/score/include/rtems/score/schedulersmpimpl.h index b7d86a36e8..55d0697df1 100644 --- a/cpukit/score/include/rtems/score/schedulersmpimpl.h +++ b/cpukit/score/include/rtems/score/schedulersmpimpl.h @@ -306,7 +306,13 @@ typedef void ( *Scheduler_SMP_Update )( Priority_Control new_priority ); -typedef void ( *Scheduler_SMP_Enqueue )( +typedef Thread_Control *( *Scheduler_SMP_Enqueue )( + Scheduler_Context *context, + Scheduler_Node *node_to_enqueue, + Thread_Control *needs_help +); + +typedef Thread_Control *( *Scheduler_SMP_Enqueue_scheduled )( Scheduler_Context *context, Scheduler_Node *node_to_enqueue ); @@ -492,6 +498,8 @@ static inline Scheduler_Node *_Scheduler_SMP_Get_lowest_scheduled( * * @param[in] context The scheduler instance context. * @param[in] node The node to enqueue. + * @param[in] needs_help The thread needing help in case the node cannot be + * scheduled. * @param[in] order The order function. * @param[in] insert_ready Function to insert a node into the set of ready * nodes. @@ -506,9 +514,10 @@ static inline Scheduler_Node *_Scheduler_SMP_Get_lowest_scheduled( * @param[in] allocate_processor Function to allocate a processor to a node * based on the rules of the scheduler. */ -static inline void _Scheduler_SMP_Enqueue_ordered( +static inline Thread_Control *_Scheduler_SMP_Enqueue_ordered( Scheduler_Context *context, Scheduler_Node *node, + Thread_Control *needs_help, Chain_Node_order order, Scheduler_SMP_Insert insert_ready, Scheduler_SMP_Insert insert_scheduled, @@ -535,9 +544,13 @@ static inline void _Scheduler_SMP_Enqueue_ordered( ( *insert_scheduled )( context, node ); ( *move_from_scheduled_to_ready )( context, lowest_scheduled ); + + needs_help = _Scheduler_Node_get_user( lowest_scheduled ); } else { ( *insert_ready )( context, node ); } + + return needs_help; } /** @@ -557,7 +570,7 @@ static inline void _Scheduler_SMP_Enqueue_ordered( * @param[in] allocate_processor Function to allocate a processor to a node * based on the rules of the scheduler. */ -static inline void _Scheduler_SMP_Enqueue_scheduled_ordered( +static inline Thread_Control *_Scheduler_SMP_Enqueue_scheduled_ordered( Scheduler_Context *context, Scheduler_Node *node, Chain_Node_order order, @@ -569,6 +582,7 @@ static inline void _Scheduler_SMP_Enqueue_scheduled_ordered( ) { Scheduler_Node *highest_ready = ( *get_highest_ready )( context, node ); + Thread_Control *needs_help; _Assert( highest_ready != NULL ); @@ -578,6 +592,8 @@ static inline void _Scheduler_SMP_Enqueue_scheduled_ordered( */ if ( ( *order )( &node->Node, &highest_ready->Node ) ) { ( *insert_scheduled )( context, node ); + + needs_help = NULL; } else { _Scheduler_SMP_Node_change_state( _Scheduler_SMP_Node_downcast( node ), @@ -593,7 +609,11 @@ static inline void _Scheduler_SMP_Enqueue_scheduled_ordered( ( *insert_ready )( context, node ); ( *move_from_ready_to_scheduled )( context, highest_ready ); + + needs_help = _Scheduler_Node_get_user( node ); } + + return needs_help; } static inline void _Scheduler_SMP_Extract_from_scheduled( @@ -663,7 +683,7 @@ static inline void _Scheduler_SMP_Block( } } -static inline void _Scheduler_SMP_Unblock( +static inline Thread_Control *_Scheduler_SMP_Unblock( Scheduler_Context *context, Thread_Control *thread, Scheduler_SMP_Enqueue enqueue_fifo @@ -673,23 +693,24 @@ static inline void _Scheduler_SMP_Unblock( _Scheduler_SMP_Node_change_state( node, SCHEDULER_SMP_NODE_READY ); - ( *enqueue_fifo )( context, &node->Base ); + return ( *enqueue_fifo )( context, &node->Base, thread ); } -static inline void _Scheduler_SMP_Change_priority( - Scheduler_Context *context, - Thread_Control *thread, - Priority_Control new_priority, - bool prepend_it, - Scheduler_SMP_Extract extract_from_ready, - Scheduler_SMP_Update update, - Scheduler_SMP_Enqueue enqueue_fifo, - Scheduler_SMP_Enqueue enqueue_lifo, - Scheduler_SMP_Enqueue enqueue_scheduled_fifo, - Scheduler_SMP_Enqueue enqueue_scheduled_lifo +static inline Thread_Control *_Scheduler_SMP_Change_priority( + Scheduler_Context *context, + Thread_Control *thread, + Priority_Control new_priority, + bool prepend_it, + Scheduler_SMP_Extract extract_from_ready, + Scheduler_SMP_Update update, + Scheduler_SMP_Enqueue enqueue_fifo, + Scheduler_SMP_Enqueue enqueue_lifo, + Scheduler_SMP_Enqueue_scheduled enqueue_scheduled_fifo, + Scheduler_SMP_Enqueue_scheduled enqueue_scheduled_lifo ) { Scheduler_SMP_Node *node = _Scheduler_SMP_Thread_get_node( thread ); + Thread_Control *needs_help; if ( node->state == SCHEDULER_SMP_NODE_SCHEDULED ) { _Scheduler_SMP_Extract_from_scheduled( &node->Base ); @@ -697,9 +718,9 @@ static inline void _Scheduler_SMP_Change_priority( ( *update )( context, &node->Base, new_priority ); if ( prepend_it ) { - ( *enqueue_scheduled_lifo )( context, &node->Base ); + needs_help = ( *enqueue_scheduled_lifo )( context, &node->Base ); } else { - ( *enqueue_scheduled_fifo )( context, &node->Base ); + needs_help = ( *enqueue_scheduled_fifo )( context, &node->Base ); } } else { ( *extract_from_ready )( context, &node->Base ); @@ -707,32 +728,37 @@ static inline void _Scheduler_SMP_Change_priority( ( *update )( context, &node->Base, new_priority ); if ( prepend_it ) { - ( *enqueue_lifo )( context, &node->Base ); + needs_help = ( *enqueue_lifo )( context, &node->Base, NULL ); } else { - ( *enqueue_fifo )( context, &node->Base ); + needs_help = ( *enqueue_fifo )( context, &node->Base, NULL ); } } + + return needs_help; } -static inline void _Scheduler_SMP_Yield( - Scheduler_Context *context, - Thread_Control *thread, - Scheduler_SMP_Extract extract_from_ready, - Scheduler_SMP_Enqueue enqueue_fifo, - Scheduler_SMP_Enqueue enqueue_scheduled_fifo +static inline Thread_Control *_Scheduler_SMP_Yield( + Scheduler_Context *context, + Thread_Control *thread, + Scheduler_SMP_Extract extract_from_ready, + Scheduler_SMP_Enqueue enqueue_fifo, + Scheduler_SMP_Enqueue_scheduled enqueue_scheduled_fifo ) { Scheduler_SMP_Node *node = _Scheduler_SMP_Thread_get_node( thread ); + Thread_Control *needs_help; if ( node->state == SCHEDULER_SMP_NODE_SCHEDULED ) { _Scheduler_SMP_Extract_from_scheduled( &node->Base ); - ( *enqueue_scheduled_fifo )( context, &node->Base ); + needs_help = ( *enqueue_scheduled_fifo )( context, &node->Base ); } else { ( *extract_from_ready )( context, &node->Base ); - ( *enqueue_fifo )( context, &node->Base ); + needs_help = ( *enqueue_fifo )( context, &node->Base, NULL ); } + + return needs_help; } static inline void _Scheduler_SMP_Insert_scheduled_lifo( |