summaryrefslogtreecommitdiffstats
path: root/cpukit/score
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-05-17 15:57:48 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-05-20 07:49:41 +0200
commitd2bacb6c38c2bc0e47524b943200e16ad3c26bd8 (patch)
tree42df8963185fc3be111b39ba2160f31d8a17bf8a /cpukit/score
parenttestsuites: Avoid Giant lock (diff)
downloadrtems-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.c4
-rw-r--r--cpukit/score/cpu/nios2/nios2-iic-irq.c4
-rw-r--r--cpukit/score/include/rtems/score/threaddispatch.h12
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__ )