25 #define THREAD_QUEUE_CONTEXT_OF_PRIORITY_ACTIONS( priority_actions ) \ 28 Thread_queue_Context, \ 32 #define THREAD_QUEUE_PRIORITY_QUEUE_OF_PRIORITY_AGGREGATION( \ 33 priority_aggregation \ 36 priority_aggregation, \ 37 Thread_queue_Priority_queue, \ 41 static void _Thread_queue_Do_nothing_priority_actions(
50 static void _Thread_queue_Do_nothing_extract(
61 static void _Thread_queue_Queue_enqueue(
83 spare_heads = the_thread->
Wait.spare_heads;
84 the_thread->
Wait.spare_heads = NULL;
86 if ( heads == NULL ) {
93 ( *initialize )( queue, the_thread, queue_context, heads );
96 ( *enqueue )( queue, the_thread, queue_context, heads );
100 static void _Thread_queue_Queue_extract(
130 current_or_previous_owner,
136 static void _Thread_queue_FIFO_do_initialize(
154 static void _Thread_queue_FIFO_do_enqueue(
172 static void _Thread_queue_FIFO_do_extract(
182 (void) current_or_previous_owner;
183 (void) queue_context;
190 static void _Thread_queue_FIFO_enqueue(
196 _Thread_queue_Queue_enqueue(
200 _Thread_queue_FIFO_do_initialize,
201 _Thread_queue_FIFO_do_enqueue
205 static void _Thread_queue_FIFO_extract(
211 _Thread_queue_Queue_extract(
217 _Thread_queue_FIFO_do_extract
232 scheduler_node = SCHEDULER_NODE_OF_WAIT_PRIORITY_NODE( first );
246 first = _Thread_queue_FIFO_first( heads );
247 _Thread_queue_Queue_extract(
253 _Thread_queue_FIFO_do_extract
259 static size_t _Thread_queue_Scheduler_index(
263 #if defined(RTEMS_SMP) 269 (void) scheduler_node;
276 size_t scheduler_index
279 #if defined(RTEMS_SMP) 280 return &heads->
Priority[ scheduler_index ];
282 (void) scheduler_index;
292 return _Thread_queue_Priority_queue_by_index(
294 _Thread_queue_Scheduler_index( scheduler_node )
298 static Chain_Node *_Thread_queue_Priority_queue_rotation(
304 #if defined(RTEMS_SMP) 317 #if defined(RTEMS_SMP) 318 static void _Thread_queue_Priority_queue_extract(
326 (void) priority_actions;
329 priority_queue = THREAD_QUEUE_PRIORITY_QUEUE_OF_PRIORITY_AGGREGATION(
337 static void _Thread_queue_Priority_priority_actions(
345 heads = queue->
heads;
356 scheduler_node = SCHEDULER_NODE_OF_WAIT_PRIORITY( priority_aggregation );
357 priority_queue = _Thread_queue_Priority_queue( heads, scheduler_node );
358 priority_action_type = priority_aggregation->
Action.
type;
360 switch ( priority_action_type ) {
361 #if defined(RTEMS_SMP) 362 case PRIORITY_ACTION_ADD:
368 &priority_queue->
Queue,
369 &scheduler_node->
Wait.Priority.
Node,
373 case PRIORITY_ACTION_REMOVE:
375 &priority_queue->
Queue,
385 _Assert( priority_action_type == PRIORITY_ACTION_CHANGE );
387 &priority_queue->
Queue,
397 static void _Thread_queue_Priority_do_initialize(
406 #if defined(RTEMS_SMP) 412 priority_queue = _Thread_queue_Priority_queue( heads, scheduler_node );
415 &priority_queue->
Queue,
419 #if defined(RTEMS_SMP) 425 while ( wait_node != wait_tail ) {
426 scheduler_node = SCHEDULER_NODE_OF_THREAD_WAIT_NODE( wait_node );
427 priority_queue = _Thread_queue_Priority_queue( heads, scheduler_node );
430 &priority_queue->
Queue,
440 static void _Thread_queue_Priority_do_enqueue(
447 #if defined(RTEMS_SMP) 458 scheduler_node = SCHEDULER_NODE_OF_THREAD_WAIT_NODE( wait_node );
459 priority_queue = _Thread_queue_Priority_queue( heads, scheduler_node );
464 &priority_queue->
Queue,
469 &priority_queue->
Queue,
470 &scheduler_node->
Wait.Priority.
Node,
476 }
while ( wait_node != wait_tail );
482 priority_queue = _Thread_queue_Priority_queue( heads, scheduler_node );
485 &priority_queue->
Queue,
486 &scheduler_node->
Wait.Priority.
Node,
492 static void _Thread_queue_Priority_do_extract(
500 #if defined(RTEMS_SMP) 511 scheduler_node = SCHEDULER_NODE_OF_THREAD_WAIT_NODE( wait_node );
512 priority_queue = _Thread_queue_Priority_queue( heads, scheduler_node );
515 &priority_queue->
Queue,
524 }
while ( wait_node != wait_tail );
530 priority_queue = _Thread_queue_Priority_queue( heads, scheduler_node );
533 &priority_queue->
Queue,
538 (void) current_or_previous_owner;
539 (void) queue_context;
542 static void _Thread_queue_Priority_do_surrender(
550 _Thread_queue_Priority_queue_rotation( heads );
551 _Thread_queue_Priority_do_extract(
554 current_or_previous_owner,
560 static void _Thread_queue_Priority_enqueue(
566 _Thread_queue_Queue_enqueue(
570 _Thread_queue_Priority_do_initialize,
571 _Thread_queue_Priority_do_enqueue
575 static void _Thread_queue_Priority_extract(
581 _Thread_queue_Queue_extract(
587 _Thread_queue_Priority_do_extract
599 #if defined(RTEMS_SMP) 609 scheduler_node = SCHEDULER_NODE_OF_WAIT_PRIORITY_NODE( first );
623 first = _Thread_queue_Priority_first( heads );
624 _Thread_queue_Queue_extract(
630 _Thread_queue_Priority_do_surrender
636 static void _Thread_queue_Priority_inherit_do_priority_actions_action(
644 &scheduler_node_of_owner->
Wait.Priority,
645 &priority_aggregation->
Node,
650 &scheduler_node_of_owner->
Wait.Priority
654 #if defined(RTEMS_SMP) 655 static void _Thread_queue_Priority_inherit_do_priority_actions_add(
661 _Thread_queue_Priority_inherit_do_priority_actions_action(
662 priority_aggregation,
669 static void _Thread_queue_Priority_inherit_do_priority_actions_remove(
675 _Thread_queue_Priority_queue_extract(
676 priority_aggregation,
680 _Thread_queue_Priority_inherit_do_priority_actions_action(
681 priority_aggregation,
684 PRIORITY_ACTION_REMOVE
689 static void _Thread_queue_Priority_inherit_do_priority_actions_change(
696 _Thread_queue_Priority_inherit_do_priority_actions_action(
697 priority_aggregation,
700 PRIORITY_ACTION_CHANGE
704 static void _Thread_queue_Priority_inherit_priority_actions(
713 heads = queue->
heads;
716 owner = queue->
owner;
725 size_t scheduler_index;
732 scheduler_node = SCHEDULER_NODE_OF_WAIT_PRIORITY( priority_aggregation );
733 scheduler_index = _Thread_queue_Scheduler_index( scheduler_node );
734 priority_queue = _Thread_queue_Priority_queue_by_index(
742 priority_action_type = priority_aggregation->
Action.
type;
744 switch ( priority_action_type ) {
745 #if defined(RTEMS_SMP) 746 case PRIORITY_ACTION_ADD:
753 &priority_queue->
Queue,
754 &scheduler_node->
Wait.Priority.
Node,
756 _Thread_queue_Priority_inherit_do_priority_actions_add,
757 _Thread_queue_Priority_inherit_do_priority_actions_change,
758 scheduler_node_of_owner
761 case PRIORITY_ACTION_REMOVE:
763 &priority_queue->
Queue,
764 &scheduler_node->
Wait.Priority.
Node,
766 _Thread_queue_Priority_inherit_do_priority_actions_remove,
767 _Thread_queue_Priority_inherit_do_priority_actions_change,
768 scheduler_node_of_owner
774 _Assert( priority_action_type == PRIORITY_ACTION_CHANGE );
776 &priority_queue->
Queue,
777 &scheduler_node->
Wait.Priority.
Node,
780 _Thread_queue_Priority_inherit_do_priority_actions_change,
781 scheduler_node_of_owner
786 priority_aggregation = next_aggregation;
790 static void _Thread_queue_Priority_inherit_do_initialize(
798 size_t scheduler_index;
802 #if defined(RTEMS_SMP) 807 owner = queue->
owner;
810 scheduler_index = _Thread_queue_Scheduler_index( scheduler_node );
811 priority_queue = _Thread_queue_Priority_queue_by_index(
822 &priority_queue->
Queue,
827 &scheduler_node_of_owner->
Wait.Priority,
832 #if defined(RTEMS_SMP) 838 while ( wait_node != wait_tail ) {
839 scheduler_node = SCHEDULER_NODE_OF_THREAD_WAIT_NODE( wait_node );
840 scheduler_index = _Thread_queue_Scheduler_index( scheduler_node );
841 priority_queue = _Thread_queue_Priority_queue_by_index(
853 &priority_queue->
Queue,
857 &scheduler_node_of_owner->
Wait.Priority,
863 &scheduler_node_of_owner->
Wait.Priority
873 static void _Thread_queue_Priority_inherit_do_enqueue_change(
880 #if defined(RTEMS_SMP) 883 scheduler_node_of_owner = arg;
886 &scheduler_node_of_owner->
Wait.Priority,
887 &priority_aggregation->
Node,
888 PRIORITY_ACTION_CHANGE
892 &scheduler_node_of_owner->
Wait.Priority
901 owner = queue->
owner;
903 queue_context = THREAD_QUEUE_CONTEXT_OF_PRIORITY_ACTIONS( priority_actions );
907 &scheduler_node_of_owner->
Wait.Priority,
908 &priority_aggregation->
Node,
909 PRIORITY_ACTION_CHANGE
915 static void _Thread_queue_Priority_inherit_do_enqueue(
922 #if defined(RTEMS_SMP) 927 owner = queue->
owner;
935 size_t scheduler_index;
939 scheduler_node = SCHEDULER_NODE_OF_THREAD_WAIT_NODE( wait_node );
940 scheduler_index = _Thread_queue_Scheduler_index( scheduler_node );
941 priority_queue = _Thread_queue_Priority_queue_by_index(
954 &priority_queue->
Queue,
958 &scheduler_node_of_owner->
Wait.Priority,
964 &scheduler_node_of_owner->
Wait.Priority
968 &priority_queue->
Queue,
969 &scheduler_node->
Wait.Priority.
Node,
971 _Thread_queue_Priority_inherit_do_enqueue_change,
972 scheduler_node_of_owner
977 }
while ( wait_node != wait_tail );
987 priority_queue = _Thread_queue_Priority_queue( heads, scheduler_node );
990 &priority_queue->
Queue,
991 &scheduler_node->
Wait.Priority.
Node,
993 _Thread_queue_Priority_inherit_do_enqueue_change,
999 static void _Thread_queue_Priority_inherit_enqueue(
1005 _Thread_queue_Queue_enqueue(
1009 _Thread_queue_Priority_inherit_do_initialize,
1010 _Thread_queue_Priority_inherit_do_enqueue
1014 static void _Thread_queue_Priority_inherit_do_extract_action(
1021 #if defined(RTEMS_SMP) 1024 scheduler_node_of_owner = arg;
1027 &scheduler_node_of_owner->
Wait.Priority,
1028 &priority_aggregation->
Node,
1029 priority_action_type
1033 &scheduler_node_of_owner->
Wait.Priority
1040 queue_context = THREAD_QUEUE_CONTEXT_OF_PRIORITY_ACTIONS( priority_actions );
1046 &scheduler_node_of_owner->
Wait.Priority,
1047 &priority_aggregation->
Node,
1048 priority_action_type
1054 static void _Thread_queue_Priority_inherit_do_extract_remove(
1060 _Thread_queue_Priority_inherit_do_extract_action(
1063 priority_aggregation,
1064 PRIORITY_ACTION_REMOVE
1068 static void _Thread_queue_Priority_inherit_do_extract_change(
1075 _Thread_queue_Priority_inherit_do_extract_action(
1078 priority_aggregation,
1079 PRIORITY_ACTION_CHANGE
1083 static void _Thread_queue_Priority_inherit_do_extract(
1091 #if defined(RTEMS_SMP) 1098 #if defined(RTEMS_SMP) 1105 size_t scheduler_index;
1108 scheduler_node = SCHEDULER_NODE_OF_THREAD_WAIT_NODE( wait_node );
1109 scheduler_index = _Thread_queue_Scheduler_index( scheduler_node );
1110 priority_queue = _Thread_queue_Priority_queue_by_index(
1120 &priority_queue->
Queue,
1121 &scheduler_node->
Wait.Priority.
Node,
1123 _Thread_queue_Priority_inherit_do_extract_remove,
1124 _Thread_queue_Priority_inherit_do_extract_change,
1125 scheduler_node_of_owner
1133 }
while ( wait_node != wait_tail );
1140 priority_queue = _Thread_queue_Priority_queue( heads, scheduler_node );
1143 &priority_queue->
Queue,
1144 &scheduler_node->
Wait.Priority.
Node,
1146 _Thread_queue_Priority_inherit_do_extract_remove,
1147 _Thread_queue_Priority_inherit_do_extract_change,
1153 static void _Thread_queue_Priority_inherit_extract(
1159 #if defined(RTEMS_SMP) 1191 _Thread_queue_Queue_extract(
1197 _Thread_queue_Priority_inherit_do_extract
1200 #if defined(RTEMS_SMP) 1205 #if defined(RTEMS_SMP) 1206 static void _Thread_queue_Priority_inherit_do_surrender_add(
1215 scheduler_node = SCHEDULER_NODE_OF_WAIT_PRIORITY( priority_aggregation );
1226 static void _Thread_queue_Priority_inherit_do_surrender_remove(
1235 scheduler_node = SCHEDULER_NODE_OF_WAIT_PRIORITY( priority_aggregation );
1243 static void _Thread_queue_Priority_inherit_do_surrender_change(
1250 #if defined(RTEMS_SMP) 1254 THREAD_QUEUE_CONTEXT_OF_PRIORITY_ACTIONS( priority_actions ),
1259 SCHEDULER_NODE_OF_WAIT_PRIORITY( priority_aggregation ),
1265 #if defined(RTEMS_SMP) 1266 static void _Thread_queue_Priority_inherit_do_surrender_change_2(
1274 SCHEDULER_NODE_OF_WAIT_PRIORITY( priority_aggregation ),
1281 static void _Thread_queue_Priority_inherit_do_surrender(
1289 #if defined(RTEMS_SMP) 1301 #if defined(RTEMS_SMP) 1307 fifo_node = _Thread_queue_Priority_queue_rotation( heads );
1318 _Assert( scheduler_node_of_owner->
owner == previous_owner );
1321 &scheduler_node_of_owner->
Wait.Priority,
1324 _Thread_queue_Priority_inherit_do_surrender_remove,
1325 _Thread_queue_Priority_inherit_do_surrender_change,
1330 }
while ( fifo_node != fifo_head );
1353 scheduler_node = SCHEDULER_NODE_OF_THREAD_WAIT_NODE( wait_node );
1354 priority_queue = _Thread_queue_Priority_queue( heads, scheduler_node );
1357 &priority_queue->
Queue,
1358 &scheduler_node->
Wait.Priority.
Node,
1360 _Thread_queue_Priority_queue_extract,
1366 }
while ( wait_node != wait_tail );
1373 while ( fifo_node != fifo_tail ) {
1385 &scheduler_node->
Wait.Priority,
1388 _Thread_queue_Priority_inherit_do_surrender_add,
1389 _Thread_queue_Priority_inherit_do_surrender_change_2,
1397 priority_queue = _Thread_queue_Priority_queue( heads, scheduler_node );
1401 &scheduler_node_of_owner->
Wait.Priority,
1404 _Thread_queue_Priority_inherit_do_surrender_change,
1408 &priority_queue->
Queue,
1409 &scheduler_node->
Wait.Priority.
Node,
1419 &scheduler_node->
Wait.Priority,
1422 _Thread_queue_Priority_inherit_do_surrender_change,
1438 first = _Thread_queue_Priority_first( heads );
1439 _Thread_queue_Queue_extract(
1445 _Thread_queue_Priority_inherit_do_surrender
1453 .extract = _Thread_queue_Do_nothing_extract
1463 .enqueue = _Thread_queue_FIFO_enqueue,
1464 .extract = _Thread_queue_FIFO_extract,
1465 .surrender = _Thread_queue_FIFO_surrender,
1466 .first = _Thread_queue_FIFO_first
1471 .enqueue = _Thread_queue_Priority_enqueue,
1472 .extract = _Thread_queue_Priority_extract,
1473 .surrender = _Thread_queue_Priority_surrender,
1474 .first = _Thread_queue_Priority_first
1479 .enqueue = _Thread_queue_Priority_inherit_enqueue,
1480 .extract = _Thread_queue_Priority_inherit_extract,
1481 .surrender = _Thread_queue_Priority_inherit_surrender,
1482 .first = _Thread_queue_Priority_first
Thread_Control * owner
The thread queue owner.
The priority aggregation.
static __inline__ Chain_Node * _Chain_First(const Chain_Control *the_chain)
Returns pointer to chain's first node.
static __inline__ void _Priority_Initialize_one(Priority_Aggregation *aggregation, Priority_Node *node)
Initializes the priority aggregation with the given information.
static __inline__ void _Priority_Non_empty_insert(Priority_Aggregation *aggregation, Priority_Node *node, Priority_Actions *actions, Priority_Change_handler change, void *arg)
Inserts the node in a nonempty aggregation and handles change if the node is the new minimum...
static __inline__ const Scheduler_Control * _Priority_Get_scheduler(const Priority_Aggregation *aggregation)
Gets the priority aggregation's scheduler.
Thread_Wait_information Wait
Thread queue context for the thread queue methods.
static __inline__ Scheduler_Node * _Thread_Scheduler_get_node_by_index(const Thread_Control *the_thread, size_t scheduler_index)
Gets the thread's scheduler node by index.
The priority node to build up a priority aggregation.
Priority_Actions Actions
A priority action list.
static __inline__ void _Chain_Initialize_node(Chain_Node *the_node)
Initializes a chain node.
static __inline__ void _Priority_Set_action(Priority_Aggregation *aggregation, Priority_Node *node, Priority_Action_type type)
Sets the action type and action node of the priority aggregation.
Inlined Routines Associated with the Manipulation of the Scheduler.
Thread_queue_Priority_queue Priority[RTEMS_ZERO_LENGTH_ARRAY]
One priority queue per scheduler instance.
A list of priority actions.
static __inline__ Chain_Node * _Chain_Get_first_unprotected(Chain_Control *the_chain)
Gets the first node (unprotected).
Thread_Scheduler_control Scheduler
Scheduler related control.
struct Priority_Aggregation::@17 Action
A priority action block to manage priority node additions, changes and removals.
static __inline__ void _Thread_queue_Context_add_priority_update(Thread_queue_Context *queue_context, Thread_Control *the_thread)
Adds a priority update of the thread to the thread queue context.
static __inline__ void _Priority_Insert(Priority_Aggregation *aggregation, Priority_Node *node, Priority_Actions *actions, Priority_Add_handler add, Priority_Change_handler change, void *arg)
static __inline__ void _Priority_Plain_extract(Priority_Aggregation *aggregation, Priority_Node *node)
Extracts the priority node from the aggregation.
struct Scheduler_Node::@19 Thread
Block to register and manage this scheduler node in the thread control block of the owner of this sch...
Chain_Node Node
Node to enqueue this queue in the FIFO chain of the corresponding heads structure.
bool _Thread_queue_Path_acquire_critical(Thread_queue_Queue *queue, Thread_Control *the_thread, Thread_queue_Context *queue_context)
Does nothing.
Information for the Assert Handler.
Chain_Node Wait_node
Node to add this scheduler node to Thread_Control::Scheduler::Wait_nodes.
Thread_queue_Heads * heads
The thread queue heads.
static __inline__ Priority_Node * _Priority_Get_minimum_node(const Priority_Aggregation *aggregation)
Gets the minimum node of the priority aggregation.
#define RTEMS_CONTAINER_OF(_m, _type, _member_name)
Returns the pointer to the container of a specified member pointer.
static __inline__ void _Chain_Append_unprotected(Chain_Control *the_chain, Chain_Node *the_node)
Appends a node (unprotected).
Priority_Action_type type
The type of the action.
static __inline__ void _Priority_Changed(Priority_Aggregation *aggregation, Priority_Node *node, bool prepend_it, Priority_Actions *actions, Priority_Change_handler change, void *arg)
Updates the priority of the node in the aggregation.
Chain_Control Free_chain
A chain with free thread queue heads providing the spare thread queue heads for a thread once it is d...
Priority_Aggregation Queue
The actual thread priority queue.
static __inline__ void _Chain_Prepend_unprotected(Chain_Control *the_chain, Chain_Node *the_node)
Prepends a node (unprotected).
struct Thread_queue_Context::@31 Priority
Block to manage thread priority changes due to a thread queue operation.
static __inline__ Scheduler_Node * _Thread_Scheduler_get_home_node(const Thread_Control *the_thread)
Gets the scheduler's home node.
static __inline__ Chain_Node * _Chain_Next(const Chain_Node *the_node)
Returns pointer to the next node from this node.
static __inline__ Priority_Aggregation * _Priority_Actions_move(Priority_Actions *actions)
Moves the priority actions' actions.
Thread_queue_Priority_actions_operation priority_actions
Thread queue priority actions operation.
static __inline__ Thread_Control * _Scheduler_Node_get_owner(const Scheduler_Node *node)
Gets the owner of the node.
static __inline__ void _Chain_Extract_unprotected(Chain_Node *the_node)
Extracts this node (unprotected).
static __inline__ bool _Priority_Actions_is_valid(const Priority_Aggregation *aggregation)
Checks if the priority actions is valid.
struct _Thread_Control * owner
The thread owning this node.
Priority_Node Node
This priority node reflects the overall priority of the aggregation.
void _Thread_Priority_perform_actions(Thread_Control *start_of_path, Thread_queue_Context *queue_context)
Checks if the thread is owner of the lock of the join queue.
Inlined Routines Associated with Red-Black Trees.
static __inline__ void _Priority_Extract_non_empty(Priority_Aggregation *aggregation, Priority_Node *node, Priority_Actions *actions, Priority_Change_handler change, void *arg)
Extracts the node from the aggregation.
static __inline__ void _Priority_Change_nothing(Priority_Aggregation *aggregation, bool prepend_it, Priority_Actions *actions, void *arg)
Does nothing.
static __inline__ void _Priority_Actions_initialize_one(Priority_Actions *actions, Priority_Aggregation *aggregation, Priority_Node *node, Priority_Action_type type)
Initializes the priority actions with the given information.
static __inline__ bool _Priority_Is_empty(const Priority_Aggregation *aggregation)
Checks if the priority aggregation is empty.
static __inline__ void _Chain_Initialize_one(Chain_Control *the_chain, Chain_Node *the_node)
Initializes this chain to contain exactly the specified node.
struct Scheduler_Node::@20 Wait
Thread wait support block.
static __inline__ void _Scheduler_Node_set_priority(Scheduler_Node *node, Priority_Control new_priority, bool prepend_it)
Sets the priority of the node.
static __inline__ const Scheduler_Control * _Scheduler_Node_get_scheduler(const Scheduler_Node *node)
Gets the scheduler of the node.
static __inline__ void _Priority_Actions_add(Priority_Actions *actions, Priority_Aggregation *aggregation)
Adds actions to the priority actions' actions.
Chain_Node Free_node
A chain node to add these thread queue heads to the free chain of the thread queue heads dedicated to...
Scheduler node for per-thread data.
Inlined Routines from the Thread Handler.
static __inline__ Priority_Control _Priority_Get_priority(const Priority_Aggregation *aggregation)
Gets the priority aggregation's priority.
struct Scheduler_Node * scheduler_node
This priority queue is added to a scheduler node of the owner in case of priority inheritance...
static __inline__ void _Thread_Wait_acquire_default_critical(Thread_Control *the_thread, ISR_lock_Context *lock_context)
Acquires the thread wait default lock inside a critical section (interrupts disabled).
static __inline__ Chain_Node * _Chain_Previous(const Chain_Node *the_node)
Returns pointer to the previous node from this node.
static __inline__ void _Priority_Actions_initialize_empty(Priority_Actions *actions)
Initializes the priority actions empty.
Chain_Control Wait_nodes
Scheduler nodes immediately available to the thread by its home scheduler and due to thread queue own...
static __inline__ const Chain_Node * _Chain_Immutable_head(const Chain_Control *the_chain)
Returns pointer to immutable chain head.
static __inline__ bool _Priority_Actions_is_empty(const Priority_Actions *actions)
Checks if the priority actions is empty.
static __inline__ void _Thread_Scheduler_remove_wait_node(Thread_Control *the_thread, Scheduler_Node *scheduler_node)
Remove a wait node from the thread and add a corresponding request to it.
Local ISR lock context for acquire and release pairs.
void _Thread_queue_Path_release_critical(Thread_queue_Context *queue_context)
Releases the thread queue path in a critical section.
Priority_Action_type
The priority action type.
static __inline__ void _Thread_Wait_release_default_critical(Thread_Control *the_thread, ISR_lock_Context *lock_context)
Releases the thread wait default lock inside a critical section (interrupts disabled).
union Priority_Node::@16 Node
Node component for a chain or red-black tree.
static __inline__ void _Priority_Remove_nothing(Priority_Aggregation *aggregation, Priority_Actions *actions, void *arg)
Does nothing.
static __inline__ bool _Chain_Is_empty(const Chain_Control *the_chain)
Checks if the chain is empty.
static __inline__ void _Priority_Plain_changed(Priority_Aggregation *aggregation, Priority_Node *node)
Updates the priority of the node in the aggregation.
static __inline__ void _Priority_Extract(Priority_Aggregation *aggregation, Priority_Node *node, Priority_Actions *actions, Priority_Remove_handler remove, Priority_Change_handler change, void *arg)
Extracts the node from the aggregation.
Chain_Control Fifo
This is the FIFO discipline list.
static __inline__ uint32_t _Scheduler_Get_index(const Scheduler_Control *scheduler)
Gets the index of the scheduler.
static __inline__ Priority_Aggregation * _Priority_Get_next_action(const Priority_Aggregation *aggregation)
Gets the next action of the priority aggregation.
static __inline__ void _Thread_Scheduler_add_wait_node(Thread_Control *the_thread, Scheduler_Node *scheduler_node)
Adds a wait node to the thread and adds a corresponding request to the thread.
static __inline__ const Chain_Node * _Chain_Immutable_tail(const Chain_Control *the_chain)
Returns pointer to immutable chain tail.
#define _Assert(_e)
Assertion similar to assert() controlled via RTEMS_DEBUG instead of NDEBUG.
union _Thread_queue_Heads::@32 Heads
static __inline__ bool _Priority_Plain_insert(Priority_Aggregation *aggregation, Priority_Node *node, Priority_Control priority)
Inserts the node with the given priority into the priority aggregation's contributors.