File indexing completed on 2025-05-11 08:24:27
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037 #ifdef HAVE_CONFIG_H
0038 #include "config.h"
0039 #endif
0040
0041 #include <rtems/score/threadimpl.h>
0042 #include <rtems/score/schedulerimpl.h>
0043
0044 #if defined(RTEMS_SMP)
0045 static void _Thread_Scheduler_withdraw_nodes(
0046 Thread_Control *the_thread,
0047 Scheduler_Node *scheduler_node
0048 )
0049 {
0050 while ( scheduler_node != NULL ) {
0051 Scheduler_Node *next;
0052 const Scheduler_Control *scheduler;
0053 ISR_lock_Context lock_context;
0054
0055 next = scheduler_node->Thread.Scheduler_node.next;
0056 #if defined(RTEMS_DEBUG)
0057 scheduler_node->Thread.Scheduler_node.next = NULL;
0058 #endif
0059
0060 scheduler = _Scheduler_Node_get_scheduler( scheduler_node );
0061
0062 _Scheduler_Acquire_critical( scheduler, &lock_context );
0063 ( *scheduler->Operations.withdraw_node )(
0064 scheduler,
0065 the_thread,
0066 scheduler_node,
0067 THREAD_SCHEDULER_READY
0068 );
0069 _Scheduler_Release_critical( scheduler, &lock_context );
0070
0071 scheduler_node = next;
0072 }
0073 }
0074
0075 void _Thread_Scheduler_process_requests( Thread_Control *the_thread )
0076 {
0077 ISR_lock_Context lock_context;
0078 Scheduler_Node *scheduler_node;
0079
0080 _Thread_Scheduler_acquire_critical( the_thread, &lock_context );
0081
0082 scheduler_node = the_thread->Scheduler.requests;
0083
0084 if ( scheduler_node != NULL ) {
0085 Scheduler_Node *remove;
0086
0087 the_thread->Scheduler.requests = NULL;
0088 remove = NULL;
0089
0090 do {
0091 Scheduler_Node_request request;
0092 Scheduler_Node *next;
0093
0094 request = scheduler_node->Thread.request;
0095 scheduler_node->Thread.request = SCHEDULER_NODE_REQUEST_NOT_PENDING;
0096
0097 next = scheduler_node->Thread.next_request;
0098 #if defined(RTEMS_DEBUG)
0099 scheduler_node->Thread.next_request = NULL;
0100 #endif
0101
0102 if ( request == SCHEDULER_NODE_REQUEST_ADD ) {
0103 ++the_thread->Scheduler.helping_nodes;
0104 _Chain_Append_unprotected(
0105 &the_thread->Scheduler.Scheduler_nodes,
0106 &scheduler_node->Thread.Scheduler_node.Chain
0107 );
0108 } else if ( request == SCHEDULER_NODE_REQUEST_REMOVE ) {
0109 --the_thread->Scheduler.helping_nodes;
0110 _Chain_Extract_unprotected(
0111 &scheduler_node->Thread.Scheduler_node.Chain
0112 );
0113 scheduler_node->Thread.Scheduler_node.next = remove;
0114 remove = scheduler_node;
0115 } else {
0116 _Assert( request == SCHEDULER_NODE_REQUEST_NOTHING );
0117 }
0118
0119 scheduler_node = next;
0120 } while ( scheduler_node != NULL );
0121
0122 _Thread_Scheduler_release_critical( the_thread, &lock_context );
0123 _Thread_Scheduler_withdraw_nodes( the_thread, remove );
0124 } else {
0125 _Thread_Scheduler_release_critical( the_thread, &lock_context );
0126 }
0127 }
0128 #endif