22 #ifndef _RTEMS_SCORE_SCHEDULERIMPL_H 23 #define _RTEMS_SCORE_SCHEDULERIMPL_H 29 #include <rtems/score/status.h> 76 #if defined(RTEMS_SMP) 77 return cpu->Scheduler.control;
97 #if defined(RTEMS_SMP) 121 #if defined(RTEMS_SMP) 132 #if defined(RTEMS_SMP) 146 return scheduler->is_non_preempt_mode_supported;
150 #if defined(RTEMS_SMP) 151 void _Scheduler_Request_ask_for_help(
Thread_Control *the_thread );
166 _Assert( _Thread_State_is_owner( the_thread ) );
168 if ( the_thread->
Scheduler.helping_nodes > 0 ) {
169 _Scheduler_Request_ask_for_help( the_thread );
245 #if defined(RTEMS_SMP) 255 scheduler_node = SCHEDULER_NODE_OF_THREAD_SCHEDULER_NODE( node );
268 while ( node != tail ) {
269 scheduler_node = SCHEDULER_NODE_OF_THREAD_SCHEDULER_NODE( node );
277 THREAD_SCHEDULER_BLOCKED
311 #if defined(RTEMS_SMP) 312 scheduler_node = SCHEDULER_NODE_OF_THREAD_SCHEDULER_NODE(
342 #if defined(RTEMS_SMP) 346 _Thread_Scheduler_process_requests( the_thread );
356 scheduler_node = SCHEDULER_NODE_OF_THREAD_SCHEDULER_NODE( node );
368 }
while ( node != tail );
381 #if defined(RTEMS_SMP) 392 int sticky_level_change
401 _Thread_Scheduler_process_requests( the_thread );
404 scheduler_node = SCHEDULER_NODE_OF_THREAD_SCHEDULER_NODE( node );
409 scheduler_node->sticky_level += sticky_level_change;
410 _Assert( scheduler_node->sticky_level >= 0 );
423 while ( node != tail ) {
424 scheduler_node = SCHEDULER_NODE_OF_THREAD_SCHEDULER_NODE( node );
590 if ( scheduler !=
NULL && executing !=
NULL ) {
628 #if defined(RTEMS_SMP) 632 cpu = _Per_CPU_Get_by_index( cpu_index );
635 return scheduler_of_cpu == scheduler;
655 #if defined(RTEMS_SMP) 658 return &_Processor_mask_The_one_and_only;
693 const Processor_mask *affinity
715 const cpu_set_t *cpuset
743 ( *extract )( scheduler, the_thread, node );
748 ( *schedule )( scheduler, the_thread, true );
763 #if defined(RTEMS_SMP) 784 OBJECTS_FAKE_OBJECTS_API,
785 OBJECTS_FAKE_OBJECTS_SCHEDULERS,
787 (uint16_t) ( scheduler_index + 1 )
802 return id - minimum_id;
841 #if defined(RTEMS_SMP) 860 typedef void ( *Scheduler_Release_idle_thread )(
873 Thread_Scheduler_state new_state
877 _ISR_lock_Is_owner( &the_thread->
Scheduler.Lock )
878 || the_thread->
Scheduler.state == THREAD_SCHEDULER_BLOCKED
896 _Assert( _Scheduler_Node_get_idle( node ) ==
NULL );
901 _Scheduler_Node_set_user( node, idle );
922 Scheduler_Get_idle_thread get_idle_thread
927 _Scheduler_Set_idle_thread( node, idle );
933 SCHEDULER_TRY_TO_SCHEDULE_DO_SCHEDULE,
934 SCHEDULER_TRY_TO_SCHEDULE_DO_IDLE_EXCHANGE,
935 SCHEDULER_TRY_TO_SCHEDULE_DO_BLOCK
936 } Scheduler_Try_to_schedule_action;
950 _Scheduler_Try_to_schedule_node(
954 Scheduler_Get_idle_thread get_idle_thread
958 Scheduler_Try_to_schedule_action action;
961 action = SCHEDULER_TRY_TO_SCHEDULE_DO_SCHEDULE;
963 _Assert( _Scheduler_Node_get_user( node ) == owner );
964 _Assert( _Scheduler_Node_get_idle( node ) ==
NULL );
966 _Thread_Scheduler_acquire_critical( owner, &lock_context );
968 if ( owner->
Scheduler.state == THREAD_SCHEDULER_READY ) {
969 _Thread_Scheduler_cancel_need_for_help( owner,
_Thread_Get_CPU( owner ) );
970 _Scheduler_Thread_change_state( owner, THREAD_SCHEDULER_SCHEDULED );
972 owner->
Scheduler.state == THREAD_SCHEDULER_SCHEDULED
973 && node->sticky_level <= 1
975 action = SCHEDULER_TRY_TO_SCHEDULE_DO_BLOCK;
976 }
else if ( node->sticky_level == 0 ) {
977 action = SCHEDULER_TRY_TO_SCHEDULE_DO_BLOCK;
978 }
else if ( idle !=
NULL ) {
979 action = SCHEDULER_TRY_TO_SCHEDULE_DO_IDLE_EXCHANGE;
981 _Scheduler_Use_idle_thread(
989 _Thread_Scheduler_release_critical( owner, &lock_context );
1006 Scheduler_Release_idle_thread release_idle_thread
1011 if ( idle !=
NULL ) {
1015 _Scheduler_Node_set_user( node, owner );
1016 ( *release_idle_thread )(
context, idle );
1036 uses_idle->idle =
NULL;
1037 _Scheduler_Node_set_user(
1041 _Scheduler_Set_idle_thread( needs_idle, idle );
1064 Scheduler_Get_idle_thread get_idle_thread
1071 sticky_level = node->sticky_level;
1073 node->sticky_level = sticky_level;
1076 _Thread_Scheduler_acquire_critical( thread, &lock_context );
1078 _Thread_Scheduler_cancel_need_for_help( thread, thread_cpu );
1079 _Scheduler_Thread_change_state( thread, THREAD_SCHEDULER_BLOCKED );
1080 _Thread_Scheduler_release_critical( thread, &lock_context );
1082 if ( sticky_level > 0 ) {
1083 if ( is_scheduled && _Scheduler_Node_get_idle( node ) ==
NULL ) {
1086 idle = _Scheduler_Use_idle_thread(
1092 _Thread_Dispatch_update_heir( _Per_CPU_Get(), thread_cpu, idle );
1098 _Assert( thread == _Scheduler_Node_get_user( node ) );
1114 Scheduler_Release_idle_thread release_idle_thread
1121 idle = _Scheduler_Node_get_idle( node );
1125 _Assert( _Scheduler_Node_get_user( node ) == idle );
1126 _Scheduler_Node_set_user( node, owner );
1127 ( *release_idle_thread )(
context, idle );
1131 _Thread_Dispatch_update_heir( _Per_CPU_Get(), cpu, the_thread );
1151 Scheduler_Release_idle_thread release_idle_thread
1156 ++node->sticky_level;
1157 _Assert( node->sticky_level > 0 );
1159 if ( is_scheduled ) {
1160 _Scheduler_Discard_idle_thread(
1166 _Scheduler_Thread_change_state( the_thread, THREAD_SCHEDULER_SCHEDULED );
1169 _Scheduler_Thread_change_state( the_thread, THREAD_SCHEDULER_READY );
1191 if ( heir != new_heir && ( heir->
is_preemptible || force_dispatch ) ) {
1192 #if defined(RTEMS_SMP) 1199 heir->
Scheduler.state = THREAD_SCHEDULER_BLOCKED;
1200 new_heir->
Scheduler.state = THREAD_SCHEDULER_SCHEDULED;
1203 _Thread_Heir = new_heir;
1204 _Thread_Dispatch_necessary =
true;
1227 #if defined(RTEMS_SMP) 1234 return STATUS_RESOURCE_IN_USE;
1239 &old_scheduler_node->
Wait.Priority,
1245 #
if defined(RTEMS_SMP)
1251 &old_scheduler_node->
Wait.Priority,
1255 return STATUS_RESOURCE_IN_USE;
1258 #if defined(RTEMS_SMP) 1269 || !( *new_scheduler->
Operations.set_affinity )(
1278 &old_scheduler_node->
Wait.Priority,
1282 return STATUS_UNSATISFIED;
1286 the_thread->
Scheduler.home_scheduler = new_scheduler;
1290 _Thread_Scheduler_process_requests( the_thread );
1292 new_scheduler_node = old_scheduler_node;
1298 &new_scheduler_node->
Wait.Priority,
1302 #if defined(RTEMS_SMP) 1303 if ( old_scheduler != new_scheduler ) {
1312 _Assert( old_scheduler_node->sticky_level == 0 );
1313 _Assert( new_scheduler_node->sticky_level == 0 );
1319 &new_scheduler_node->Thread.Wait_node
1322 &old_scheduler_node->Thread.Scheduler_node.Chain
1327 &new_scheduler_node->Thread.Scheduler_node.Chain
1336 return STATUS_SUCCESSFUL;
1342 return STATUS_SUCCESSFUL;
RTEMS_INLINE_ROUTINE Thread_Control * _Scheduler_Node_get_owner(const Scheduler_Node *node)
Gets the owner of the node.
Definition: schedulernodeimpl.h:135
RTEMS_INLINE_ROUTINE void _Scheduler_Node_set_priority(Scheduler_Node *node, Priority_Control new_priority, bool prepend_it)
Sets the priority of the node.
Definition: schedulernodeimpl.h:178
RTEMS_INLINE_ROUTINE void _Scheduler_Acquire_critical(const Scheduler_Control *scheduler, ISR_lock_Context *lock_context)
Acquires the scheduler instance inside a critical section (interrupts disabled).
Definition: schedulerimpl.h:92
RTEMS_INLINE_ROUTINE bool _Scheduler_Has_processor_ownership(const Scheduler_Control *scheduler, uint32_t cpu_index)
Checks if the scheduler of the cpu with the given index is equal to the given scheduler.
Definition: schedulerimpl.h:623
RTEMS_INLINE_ROUTINE void _Chain_Extract_unprotected(Chain_Node *the_node)
Extracts this node (unprotected).
Definition: chainimpl.h:558
RTEMS_INLINE_ROUTINE Scheduler_Context * _Scheduler_Get_context(const Scheduler_Control *scheduler)
Gets the context of the scheduler.
Definition: schedulerimpl.h:58
RTEMS_INLINE_ROUTINE void _Priority_Initialize_one(Priority_Aggregation *aggregation, Priority_Node *node)
Initializes the priority aggregation with the given information.
Definition: priorityimpl.h:232
RTEMS_INLINE_ROUTINE Chain_Node * _Chain_Next(const Chain_Node *the_node)
Returns pointer to the next node from this node.
Definition: chainimpl.h:327
RTEMS_INLINE_ROUTINE const Processor_mask * _SMP_Get_online_processors(void)
Gets all online processors.
Definition: smpimpl.h:318
RTEMS_INLINE_ROUTINE bool _Priority_Is_empty(const Priority_Aggregation *aggregation)
Checks if the priority aggregation is empty.
Definition: priorityimpl.h:256
bool _Scheduler_Set_affinity(Thread_Control *the_thread, size_t cpusetsize, const cpu_set_t *cpuset)
Sets the thread's scheduler's affinity.
Definition: schedulersetaffinity.c:21
uint64_t Priority_Control
The thread priority control.
Definition: priority.h:70
bool is_preemptible
Definition: thread.h:802
RTEMS_INLINE_ROUTINE const Scheduler_Control * _Scheduler_Node_get_scheduler(const Scheduler_Node *node)
Gets the scheduler of the node.
Definition: schedulernodeimpl.h:121
Scheduler context.
Definition: scheduler.h:252
RTEMS_INLINE_ROUTINE void _Thread_Set_CPU(Thread_Control *thread, Per_CPU_Control *cpu)
Sets the cpu of the thread's scheduler.
Definition: threadimpl.h:860
Thread_Wait_information Wait
Definition: thread.h:774
Thread queue context for the thread queue methods.
Definition: threadq.h:198
RTEMS_INLINE_ROUTINE void _Scheduler_Schedule(Thread_Control *the_thread)
General scheduling decision.
Definition: schedulerimpl.h:197
The priority node to build up a priority aggregation.
Definition: priority.h:98
struct _Thread_Control * executing
This is the thread executing on this processor.
Definition: percpu.h:420
void(* block)(const Scheduler_Control *, Thread_Control *, Scheduler_Node *)
Definition: scheduler.h:63
RTEMS_INLINE_ROUTINE uint32_t _Processor_mask_Count(const Processor_mask *a)
Gets the number of set bits in the processor mask.
Definition: processormask.h:271
Thread_Start_information Start
Definition: thread.h:832
Priority Handler API Implementation.
RTEMS_INLINE_ROUTINE void _Scheduler_Start_idle(const Scheduler_Control *scheduler, Thread_Control *the_thread, Per_CPU_Control *cpu)
Starts the idle thread for a particular processor.
Definition: schedulerimpl.h:604
RTEMS_INLINE_ROUTINE void _Scheduler_Release_critical(const Scheduler_Control *scheduler, ISR_lock_Context *lock_context)
Releases the scheduler instance inside a critical section (interrupts disabled).
Definition: schedulerimpl.h:116
Priority_Control priority
The priority value of this node.
Definition: priority.h:110
Thread_Scheduler_control Scheduler
Scheduler related control.
Definition: thread.h:771
Priority_Control(* unmap_priority)(const Scheduler_Control *, Priority_Control)
Definition: scheduler.h:90
RTEMS_INLINE_ROUTINE void _Scheduler_Release_job(Thread_Control *the_thread, Priority_Node *priority_node, uint64_t deadline, Thread_queue_Context *queue_context)
Releases a job of a thread with respect to the scheduler.
Definition: schedulerimpl.h:531
void(* yield)(const Scheduler_Control *, Thread_Control *, Scheduler_Node *)
Definition: scheduler.h:56
RTEMS_INLINE_ROUTINE bool _System_state_Is_up(System_state_Codes state)
Checks if the state is up.
Definition: sysstate.h:133
void(* node_initialize)(const Scheduler_Control *, Scheduler_Node *, Thread_Control *, Priority_Control)
Definition: scheduler.h:198
RTEMS_INLINE_ROUTINE 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.
Definition: threadimpl.h:1434
RTEMS_INLINE_ROUTINE void _Thread_Update_CPU_time_used(Thread_Control *the_thread, Per_CPU_Control *cpu)
Updates the cpu time used of the thread.
Definition: threadimpl.h:1129
RTEMS_INLINE_ROUTINE void _Scheduler_Update_priority(Thread_Control *the_thread)
Propagates a priority change of a thread to the scheduler.
Definition: schedulerimpl.h:340
void _Scheduler_Handler_initialization(void)
Initializes the scheduler to the policy chosen by the user.
Definition: scheduler.c:24
void(* node_destroy)(const Scheduler_Control *, Scheduler_Node *)
Definition: scheduler.h:206
RTEMS_INLINE_ROUTINE Priority_Control _Scheduler_Map_priority(const Scheduler_Control *scheduler, Priority_Control priority)
Maps a thread priority from the user domain to the scheduler domain.
Definition: schedulerimpl.h:453
uint32_t States_Control
Definition: states.h:46
Information for the Assert Handler.
RTEMS_INLINE_ROUTINE Objects_Id _Scheduler_Build_id(uint32_t scheduler_index)
Builds an object build id.
Definition: schedulerimpl.h:781
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(const Chain_Control *the_chain)
Checks if the chain is empty.
Definition: chainimpl.h:393
RTEMS_INLINE_ROUTINE uint32_t _Scheduler_Get_index(const Scheduler_Control *scheduler)
Gets the index of the scheduler.
Definition: schedulerimpl.h:834
RTEMS_INLINE_ROUTINE uint32_t _Scheduler_Get_processor_count(const Scheduler_Control *scheduler)
Gets the number of processors of the scheduler.
Definition: schedulerimpl.h:759
RTEMS_INLINE_ROUTINE void _Scheduler_Node_initialize(const Scheduler_Control *scheduler, Scheduler_Node *node, Thread_Control *the_thread, Priority_Control priority)
Initializes a scheduler node.
Definition: schedulerimpl.h:490
RTEMS_INLINE_ROUTINE uint32_t _Scheduler_Get_index_by_id(Objects_Id id)
Gets the scheduler index from the given object build id.
Definition: schedulerimpl.h:798
RTEMS_INLINE_ROUTINE void _Scheduler_Update_heir(Thread_Control *new_heir, bool force_dispatch)
Updates the heir.
Definition: schedulerimpl.h:1184
RTEMS_INLINE_ROUTINE Chain_Node * _Chain_First(const Chain_Control *the_chain)
Returns pointer to chain's first node.
Definition: chainimpl.h:260
RTEMS_INLINE_ROUTINE const Scheduler_Control * _Scheduler_Get_by_CPU(const Per_CPU_Control *cpu)
Gets the scheduler for the cpu.
Definition: schedulerimpl.h:72
RTEMS_INLINE_ROUTINE void _Priority_Node_set_priority(Priority_Node *node, Priority_Control priority)
Sets the priority of the priority node to the given priority.
Definition: priorityimpl.h:171
void(* tick)(const Scheduler_Control *, Thread_Control *)
Definition: scheduler.h:226
Per CPU Core Structure.
Definition: percpu.h:347
#define _Scheduler_Count
Count of registered schedulers.
Definition: scheduler.h:325
RTEMS_INLINE_ROUTINE void _Scheduler_Cancel_job(Thread_Control *the_thread, Priority_Node *priority_node, Thread_queue_Context *queue_context)
Cancels a job of a thread with respect to the scheduler.
Definition: schedulerimpl.h:558
RTEMS_INLINE_ROUTINE const Chain_Node * _Chain_Immutable_tail(const Chain_Control *the_chain)
Returns pointer to immutable chain tail.
Definition: chainimpl.h:243
RTEMS_INLINE_ROUTINE void _Scheduler_Block(Thread_Control *the_thread)
Blocks a thread with respect to the scheduler.
Definition: schedulerimpl.h:243
void(* schedule)(const Scheduler_Control *, Thread_Control *)
Definition: scheduler.h:53
RTEMS_INLINE_ROUTINE bool _Chain_Has_only_one_node(const Chain_Control *the_chain)
Checks if this chain has only one node.
Definition: chainimpl.h:450
RTEMS_INLINE_ROUTINE System_state_Codes _System_state_Get(void)
Gets the current system state.
Definition: sysstate.h:90
States_Control current_state
Definition: thread.h:756
void(* unblock)(const Scheduler_Control *, Thread_Control *, Scheduler_Node *)
Definition: scheduler.h:70
void(* cancel_job)(const Scheduler_Control *, Thread_Control *, Priority_Node *, Thread_queue_Context *)
Definition: scheduler.h:218
#define _ISR_lock_Acquire(_lock, _context)
Acquires an ISR lock inside an ISR disabled section.
Definition: isrlock.h:293
RTEMS_INLINE_ROUTINE void _Chain_Initialize_one(Chain_Control *the_chain, Chain_Node *the_node)
Initializes this chain to contain exactly the specified node.
Definition: chainimpl.h:528
const Scheduler_Control _Scheduler_Table[]
Registered schedulers.
#define _ISR_lock_Release(_lock, _context)
Releases an ISR lock inside an ISR disabled section.
Definition: isrlock.h:316
RTEMS_INLINE_ROUTINE void _Scheduler_Yield(Thread_Control *the_thread)
Scheduler yield with a particular thread.
Definition: schedulerimpl.h:218
bool _Scheduler_Get_affinity(Thread_Control *the_thread, size_t cpusetsize, cpu_set_t *cpuset)
Copies the thread's scheduler's affinity to the given cpuset.
Definition: schedulergetaffinity.c:21
RTEMS_INLINE_ROUTINE void _Scheduler_Unblock(Thread_Control *the_thread)
Unblocks a thread with respect to the scheduler.
Definition: schedulerimpl.h:305
RTEMS_INLINE_ROUTINE Per_CPU_Control * _Thread_Get_CPU(const Thread_Control *thread)
Gets the cpu of the thread's scheduler.
Definition: threadimpl.h:841
Priority_Control(* map_priority)(const Scheduler_Control *, Priority_Control)
Definition: scheduler.h:84
#define _Objects_Local_node
The local MPCI node number.
Definition: object.h:347
RTEMS_INLINE_ROUTINE void _Thread_queue_Context_clear_priority_updates(Thread_queue_Context *queue_context)
Clears the priority update count of the thread queue context.
Definition: threadqimpl.h:338
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing(const Thread_Control *the_thread)
Checks if the thread is the currently executing thread.
Definition: threadimpl.h:884
void(* update_priority)(const Scheduler_Control *, Thread_Control *, Scheduler_Node *)
Definition: scheduler.h:77
RTEMS_INLINE_ROUTINE const Scheduler_Control * _Thread_Scheduler_get_home(const Thread_Control *the_thread)
Gets the home scheduler of the thread.
Definition: threadimpl.h:1393
#define _Objects_Build_id(the_api, the_class, node, index)
Builds an object ID from its components.
Definition: object.h:317
unsigned context
Definition: tlb.h:108
RTEMS_INLINE_ROUTINE Priority_Control _Scheduler_Unmap_priority(const Scheduler_Control *scheduler, Priority_Control priority)
Unmaps a thread priority from the scheduler domain to the user domain.
Definition: schedulerimpl.h:469
RTEMS_INLINE_ROUTINE 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.
Definition: priorityimpl.h:411
Scheduler_Operations Operations
The scheduler operations.
Definition: scheduler.h:278
Scheduler control.
Definition: scheduler.h:269
Scheduler node for per-thread data.
Definition: schedulernode.h:79
RTEMS_INLINE_ROUTINE bool _Thread_Is_heir(const Thread_Control *the_thread)
Checks if the thread is the heir.
Definition: threadimpl.h:923
Inlined Routines from the Thread Handler.
RTEMS_INLINE_ROUTINE bool _States_Is_ready(States_Control the_states)
Checks if the state is ready.
Definition: statesimpl.h:195
struct Scheduler_Node::@3980 Wait
Thread wait support block.
uint32_t Objects_Id
Definition: object.h:80
RTEMS_INLINE_ROUTINE void _Scheduler_Node_destroy(const Scheduler_Control *scheduler, Scheduler_Node *node)
Destroys a scheduler node.
Definition: schedulerimpl.h:514
RTEMS_INLINE_ROUTINE Status_Control _Scheduler_Set(const Scheduler_Control *new_scheduler, Thread_Control *the_thread, Priority_Control priority)
Sets a new scheduler.
Definition: schedulerimpl.h:1219
RTEMS_INLINE_ROUTINE bool _Processor_mask_Is_subset(const Processor_mask *big, const Processor_mask *small)
Checks if the processor set small is a subset of processor set big.
Definition: processormask.h:192
void(* start_idle)(const Scheduler_Control *, Thread_Control *, struct Per_CPU_Control *)
Definition: scheduler.h:229
Scheduler_Context * context
Reference to a statically allocated scheduler context.
Definition: scheduler.h:273
Local ISR lock context for acquire and release pairs.
Definition: isrlock.h:65
RTEMS_INLINE_ROUTINE void _Priority_Plain_extract(Priority_Aggregation *aggregation, Priority_Node *node)
Extracts the priority node from the aggregation.
Definition: priorityimpl.h:433
RTEMS_INLINE_ROUTINE const Scheduler_Control * _Scheduler_Get_by_id(Objects_Id id)
Gets the scheduler from the given object build id.
Definition: schedulerimpl.h:812
RTEMS_INLINE_ROUTINE const Processor_mask * _Scheduler_Get_processors(const Scheduler_Control *scheduler)
Gets the processors of the scheduler.
Definition: schedulerimpl.h:651
Priority_Node Real_priority
The base priority of this thread in its home scheduler instance.
Definition: thread.h:761
#define RTEMS_INLINE_ROUTINE
Definition: basedefs.h:66
Constants and Structures Associated with the Scheduler.
RTEMS_INLINE_ROUTINE void _Scheduler_Generic_block(const Scheduler_Control *scheduler, Thread_Control *the_thread, Scheduler_Node *node, void(*extract)(const Scheduler_Control *, Thread_Control *, Scheduler_Node *), void(*schedule)(const Scheduler_Control *, Thread_Control *, bool))
Blocks the thread.
Definition: schedulerimpl.h:727
void(* release_job)(const Scheduler_Control *, Thread_Control *, Priority_Node *, uint64_t, Thread_queue_Context *)
Definition: scheduler.h:209
RTEMS_INLINE_ROUTINE void _Scheduler_Tick(const Per_CPU_Control *cpu)
Scheduler method invoked at each clock tick.
Definition: schedulerimpl.h:585
#define _Assert(_e)
Assertion similar to assert() controlled via RTEMS_DEBUG instead of NDEBUG.
Definition: assert.h:100
SuperCore SMP Implementation.
RTEMS_INLINE_ROUTINE bool _Scheduler_default_Set_affinity_body(const Scheduler_Control *scheduler, Thread_Control *the_thread, Scheduler_Node *node, const Processor_mask *affinity)
Checks if the affinity is a subset of the online processors.
Definition: schedulerimpl.h:689
RTEMS_INLINE_ROUTINE Scheduler_Node * _Thread_Scheduler_get_home_node(const Thread_Control *the_thread)
Gets the scheduler's home node.
Definition: threadimpl.h:1412
#define NULL
Requests a GPIO pin group configuration.
Definition: bestcomm_api.h:77