diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-17 15:57:48 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-20 07:49:41 +0200 |
commit | d2bacb6c38c2bc0e47524b943200e16ad3c26bd8 (patch) | |
tree | 42df8963185fc3be111b39ba2160f31d8a17bf8a /cpukit/score | |
parent | testsuites: Avoid Giant lock (diff) | |
download | rtems-d2bacb6c38c2bc0e47524b943200e16ad3c26bd8.tar.bz2 |
score: _Thread_Dispatch_increment_disable_level()
Avoid _Thread_Dispatch_increment_disable_level() and
_Thread_Dispatch_decrement_disable_level() and thus the Giant
lock.
This is a preparation to remove the Giant lock.
Update #2555.
Diffstat (limited to 'cpukit/score')
-rw-r--r-- | cpukit/score/cpu/lm32/irq.c | 4 | ||||
-rw-r--r-- | cpukit/score/cpu/nios2/nios2-iic-irq.c | 4 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/threaddispatch.h | 12 |
3 files changed, 16 insertions, 4 deletions
diff --git a/cpukit/score/cpu/lm32/irq.c b/cpukit/score/cpu/lm32/irq.c index 1c50b1133a..be84d747b6 100644 --- a/cpukit/score/cpu/lm32/irq.c +++ b/cpukit/score/cpu/lm32/irq.c @@ -42,7 +42,7 @@ void __ISR_Handler(uint32_t vector, CPU_Interrupt_frame *ifr) /* Interrupts are disabled upon entry to this Handler */ - _Thread_Dispatch_increment_disable_level(); + _Thread_Dispatch_disable(); #if( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE) if ( _ISR_Nest_level == 0 ) { @@ -69,7 +69,7 @@ void __ISR_Handler(uint32_t vector, CPU_Interrupt_frame *ifr) stack_ptr = _old_stack_ptr; #endif - _Thread_Dispatch_decrement_disable_level(); + _Thread_Dispatch_unnest( _Per_CPU_Get() ); _CPU_ISR_Enable( level ); diff --git a/cpukit/score/cpu/nios2/nios2-iic-irq.c b/cpukit/score/cpu/nios2/nios2-iic-irq.c index 75d533d633..99f1618f02 100644 --- a/cpukit/score/cpu/nios2/nios2-iic-irq.c +++ b/cpukit/score/cpu/nios2/nios2-iic-irq.c @@ -108,14 +108,14 @@ void __ISR_Handler(void) _ISR_Nest_level++; - _Thread_Dispatch_increment_disable_level(); + _Thread_Dispatch_disable(); __IIC_Handler(); /* Make sure that interrupts are disabled again */ _CPU_ISR_Disable( level ); - _Thread_Dispatch_decrement_disable_level(); + _Thread_Dispatch_unnest( _Per_CPU_Get() ); _ISR_Nest_level--; diff --git a/cpukit/score/include/rtems/score/threaddispatch.h b/cpukit/score/include/rtems/score/threaddispatch.h index bf846e3497..b0dd64cf18 100644 --- a/cpukit/score/include/rtems/score/threaddispatch.h +++ b/cpukit/score/include/rtems/score/threaddispatch.h @@ -341,6 +341,18 @@ RTEMS_INLINE_ROUTINE void _Thread_Dispatch_enable( Per_CPU_Control *cpu_self ) } /** + * @brief Unnests thread dispatching. + * + * This function does not release the Giant lock. + * + * @param[in] cpu_self The current processor. + */ +RTEMS_INLINE_ROUTINE void _Thread_Dispatch_unnest( Per_CPU_Control *cpu_self ) +{ + --cpu_self->thread_dispatch_disable_level; +} + +/** * @brief Disables thread dispatching and acquires the Giant lock. */ #if defined ( __THREAD_DO_NOT_INLINE_DISABLE_DISPATCH__ ) |