diff options
Diffstat (limited to '')
-rw-r--r-- | cpukit/score/src/smpmulticastaction.c | 14 | ||||
-rw-r--r-- | testsuites/smptests/smpcache01/init.c | 5 | ||||
-rw-r--r-- | testsuites/smptests/smpmulticast01/init.c | 3 |
3 files changed, 13 insertions, 9 deletions
diff --git a/cpukit/score/src/smpmulticastaction.c b/cpukit/score/src/smpmulticastaction.c index 966a119217..88f874eb59 100644 --- a/cpukit/score/src/smpmulticastaction.c +++ b/cpukit/score/src/smpmulticastaction.c @@ -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 ); + } } diff --git a/testsuites/smptests/smpcache01/init.c b/testsuites/smptests/smpcache01/init.c index e9cee1eec5..878a015bf1 100644 --- a/testsuites/smptests/smpcache01/init.c +++ b/testsuites/smptests/smpcache01/init.c @@ -126,15 +126,12 @@ static void call_tests_isr_disabled( SMP_barrier_State *bs ) broadcast_test_init(); for (i = 0; i < RTEMS_ARRAY_SIZE( test_cases ); ++i) { - Per_CPU_Control *cpu_self; - ISR_Level isr_level; + ISR_Level isr_level; - cpu_self = _Thread_Dispatch_disable(); _ISR_Local_disable( isr_level ); barrier( bs ); ( *test_cases[ i ] )(); _ISR_Local_enable( isr_level ); - _Thread_Dispatch_enable( cpu_self ); barrier( bs ); } diff --git a/testsuites/smptests/smpmulticast01/init.c b/testsuites/smptests/smpmulticast01/init.c index 3f3f7dc3fc..f8e74e22cc 100644 --- a/testsuites/smptests/smpmulticast01/init.c +++ b/testsuites/smptests/smpmulticast01/init.c @@ -59,14 +59,11 @@ static void multicast_action_irq_disabled( void *arg ) { - Per_CPU_Control *cpu_self; rtems_interrupt_level level; - cpu_self = _Thread_Dispatch_disable(); rtems_interrupt_local_disable(level); _SMP_Multicast_action(targets, handler, arg); rtems_interrupt_local_enable(level); - _Thread_Dispatch_enable(cpu_self); } static void multicast_action_dispatch_disabled( |