summaryrefslogtreecommitdiffstats
path: root/cpukit
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2010-07-27 01:48:46 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2010-07-27 01:48:46 +0000
commit37d6e55b984c7fb9256bd701f516cccd1d84779b (patch)
tree76fe770c1ce35241796c00e7b66f34c24d2ae272 /cpukit
parent2010-07-26 Joel Sherrill <joel.sherrill@oarcorp.com> (diff)
downloadrtems-37d6e55b984c7fb9256bd701f516cccd1d84779b.tar.bz2
2010-07-26 Joel Sherrill <joel.sherrilL@OARcorp.com>
* rtems/src/taskmode.c, score/inline/rtems/score/thread.inl: Rework a bit to eliminate unreachable path for task blocked while calling rtems_task_mode() on itself.
Diffstat (limited to 'cpukit')
-rw-r--r--cpukit/ChangeLog6
-rw-r--r--cpukit/rtems/src/taskmode.c16
-rw-r--r--cpukit/score/inline/rtems/score/thread.inl11
3 files changed, 20 insertions, 13 deletions
diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog
index 620fb669d7..c78cc85fbd 100644
--- a/cpukit/ChangeLog
+++ b/cpukit/ChangeLog
@@ -1,3 +1,9 @@
+2010-07-26 Joel Sherrill <joel.sherrilL@OARcorp.com>
+
+ * rtems/src/taskmode.c, score/inline/rtems/score/thread.inl: Rework a
+ bit to eliminate unreachable path for task blocked while calling
+ rtems_task_mode() on itself.
+
2010-07-26 Joel Sherrill <joel.sherrill@oarcorp.com>
* sapi/include/confdefs.h: Spelling.
diff --git a/cpukit/rtems/src/taskmode.c b/cpukit/rtems/src/taskmode.c
index 57872b11ce..40a456f2be 100644
--- a/cpukit/rtems/src/taskmode.c
+++ b/cpukit/rtems/src/taskmode.c
@@ -1,8 +1,7 @@
/*
- * RTEMS Task Manager
+ * RTEMS Task Manager - Change Task Mode
*
- *
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2010.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -32,8 +31,7 @@
#include <rtems/score/apiext.h>
#include <rtems/score/sysstate.h>
-/*PAGE
- *
+/*
* rtems_task_mode
*
* This directive enables and disables several modes of
@@ -84,7 +82,6 @@ rtems_status_code rtems_task_mode(
/*
* These are generic thread scheduling characteristics.
*/
-
if ( mask & RTEMS_PREEMPT_MASK )
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
@@ -99,14 +96,12 @@ rtems_status_code rtems_task_mode(
/*
* Set the new interrupt level
*/
-
if ( mask & RTEMS_INTERRUPT_MASK )
_Modes_Set_interrupt_level( mode_set );
/*
* This is specific to the RTEMS API
*/
-
is_asr_enabled = false;
needs_asr_dispatching = false;
@@ -121,9 +116,10 @@ rtems_status_code rtems_task_mode(
}
}
- if ( _System_state_Is_up( _System_state_Get() ) )
- if ( _Thread_Evaluate_mode() || needs_asr_dispatching )
+ if ( _System_state_Is_up( _System_state_Get() ) ) {
+ if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
+ }
return RTEMS_SUCCESSFUL;
}
diff --git a/cpukit/score/inline/rtems/score/thread.inl b/cpukit/score/inline/rtems/score/thread.inl
index 40735aff19..48721fe541 100644
--- a/cpukit/score/inline/rtems/score/thread.inl
+++ b/cpukit/score/inline/rtems/score/thread.inl
@@ -337,15 +337,20 @@ RTEMS_INLINE_ROUTINE void _Thread_Set_libc_reent (
* system and determines if a context switch is required. This
* is usually called after changing an execution mode such as preemptability
* for a thread.
+ *
+ * @param[in] are_signals_pending specifies whether or not the API
+ * level signals are pending and a dispatch is needed.
*/
-RTEMS_INLINE_ROUTINE bool _Thread_Evaluate_mode( void )
+RTEMS_INLINE_ROUTINE bool _Thread_Evaluate_is_dispatch_needed(
+ bool are_signals_pending
+)
{
Thread_Control *executing;
executing = _Thread_Executing;
- if ( !_States_Is_ready( executing->current_state ) ||
- ( !_Thread_Is_heir( executing ) && executing->is_preemptible ) ) {
+ if ( are_signals_pending ||
+ (!_Thread_Is_heir( executing ) && executing->is_preemptible) ) {
_Context_Switch_necessary = true;
return true;
}