forked from Imagelibrary/rtems
score: More robust _SMP_Multicast_action()
If the caller already disabled interrupts, then do not disable thread dispatching. Calling _SMP_Multicast_action() with interrupts disabled is a questionable use case.
This commit is contained in:
@@ -218,6 +218,7 @@ void _SMP_Multicast_action(
|
||||
Per_CPU_Jobs jobs;
|
||||
uint32_t cpu_max;
|
||||
Per_CPU_Control *cpu_self;
|
||||
uint32_t isr_level;
|
||||
|
||||
cpu_max = _SMP_Get_processor_maximum();
|
||||
_Assert( cpu_max <= CPU_MAXIMUM_PROCESSORS );
|
||||
@@ -228,9 +229,18 @@ void _SMP_Multicast_action(
|
||||
|
||||
jobs.handler = handler;
|
||||
jobs.arg = arg;
|
||||
isr_level = _ISR_Get_level();
|
||||
|
||||
if ( isr_level == 0 ) {
|
||||
cpu_self = _Thread_Dispatch_disable();
|
||||
} else {
|
||||
cpu_self = _Per_CPU_Get();
|
||||
}
|
||||
|
||||
cpu_self = _Thread_Dispatch_disable();
|
||||
_SMP_Issue_action_jobs( targets, &jobs, cpu_max );
|
||||
_SMP_Wait_for_action_jobs( targets, &jobs, cpu_max, cpu_self );
|
||||
_Thread_Dispatch_enable( cpu_self );
|
||||
|
||||
if ( isr_level == 0 ) {
|
||||
_Thread_Dispatch_enable( cpu_self );
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user