From 37d6e55b984c7fb9256bd701f516cccd1d84779b Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Tue, 27 Jul 2010 01:48:46 +0000 Subject: 2010-07-26 Joel Sherrill * 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. --- cpukit/ChangeLog | 6 ++++++ cpukit/rtems/src/taskmode.c | 16 ++++++---------- cpukit/score/inline/rtems/score/thread.inl | 11 ++++++++--- 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 + + * 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 * 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 #include -/*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; } -- cgit v1.2.3