The thread's blocked status is recorded in the thread's scheduler state, not directly in the thread state. This prevents blocking from being nested which violates asserts and eventually causes a crash. --- cpukit/score/src/schedulerpriorityaffinitysmp.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/cpukit/score/src/schedulerpriorityaffinitysmp.c b/cpukit/score/src/schedulerpriorityaffinitysmp.c index 10f6808..2bad6ff 100644 --- a/cpukit/score/src/schedulerpriorityaffinitysmp.c +++ b/cpukit/score/src/schedulerpriorityaffinitysmp.c @@ -550,7 +550,7 @@ Status_Control _Scheduler_priority_affinity_SMP_Set_affinity( { Scheduler_Context *context; Scheduler_priority_affinity_SMP_Node *node; - States_Control current_state; + Thread_Scheduler_state current_state; Processor_mask my_affinity; context = _Scheduler_Get_context( scheduler ); @@ -569,15 +569,15 @@ Status_Control _Scheduler_priority_affinity_SMP_Set_affinity( if ( _Processor_mask_Is_equal( &node->Affinity, affinity ) ) return STATUS_SUCCESSFUL; - current_state = thread->current_state; + current_state = thread->Scheduler.state; - if ( _States_Is_ready( current_state ) ) { + if ( current_state == THREAD_SCHEDULER_READY ) { _Scheduler_priority_affinity_SMP_Block( scheduler, thread, &node->Base.Base.Base ); } _Processor_mask_Assign( &node->Affinity, affinity ); - if ( _States_Is_ready( current_state ) ) { + if ( current_state == THREAD_SCHEDULER_READY ) { /* * FIXME: Do not ignore threads in need for help. */ -- 1.8.3.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel