On 17/08/2020 14:35, Richi Dubey wrote:
Also, can someone please explain how the thread could in the ready
state while the node is in a scheduled state in this
<https://git.rtems.org/rtems/tree/cpukit/include/rtems/score/schedulersmpimpl.h#n1517>
conditional block ?
The MrsP locking protocol performs busy waiting will a thread is
blocked. The busy waiting is carried out by idle threads.
In this case
|static inline bool _Scheduler_SMP_Ask_for_help( Scheduler_Context
*context, Thread_Control *thread, Scheduler_Node *node, Chain_Node_order
order, Scheduler_SMP_Insert insert_ready, Scheduler_SMP_Insert
insert_scheduled, Scheduler_SMP_Move move_from_scheduled_to_ready,
Scheduler_SMP_Get_lowest_scheduled get_lowest_scheduled,
Scheduler_SMP_Allocate_processor allocate_processor ) { Scheduler_Node
*lowest_scheduled; ISR_lock_Context lock_context; bool success; if (
thread->Scheduler.pinned_scheduler != NULL ) { /* * Pinned threads are
not allowed to ask for help. Return success to break * the loop in
_Thread_Ask_for_help() early. */ return true; } lowest_scheduled = (
*get_lowest_scheduled )( context, node );
_Thread_Scheduler_acquire_critical( thread, &lock_context ); if (
thread->Scheduler.state == THREAD_SCHEDULER_READY ) { [...] |
|} else if ( node_state == SCHEDULER_SMP_NODE_SCHEDULED ) {
_Thread_Scheduler_cancel_need_for_help( thread, _Thread_Get_CPU( thread
) ); _Scheduler_Discard_idle_thread( context, thread, node,
_Scheduler_SMP_Release_idle_thread ); _Scheduler_Thread_change_state(
thread, THREAD_SCHEDULER_SCHEDULED );
_Thread_Scheduler_release_critical( thread, &lock_context ); success =
true; the thread is ready to execute again, if this scheduler node is
scheduled, then it uses an idle thread to perform the busy wait. So, we
have to get rid of the idle thread and use the node for its own thread. |
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel