diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-03-18 10:37:23 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-03-18 10:38:53 +0100 |
commit | 50abce31efeb54efd1957143e3cbf279785d8a9b (patch) | |
tree | d8f8152c0078abca1562bb024f1f7e9749f4ee8d | |
parent | b4eb937ecdd9505b59f038a7f97ae76ae25c3182 (diff) |
rtems: Fix rtems_task_mode()
Do the ASR and preemption mode change only if requested by the mode
mask. The bug was introduced by
508f868237225a75e566d9fd304206363cfe441d.
-rw-r--r-- | cpukit/rtems/src/taskmode.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/cpukit/rtems/src/taskmode.c b/cpukit/rtems/src/taskmode.c index 377224c98a..96bed470f4 100644 --- a/cpukit/rtems/src/taskmode.c +++ b/cpukit/rtems/src/taskmode.c @@ -94,31 +94,37 @@ rtems_status_code rtems_task_mode( if ( ( mask & ( RTEMS_ASR_MASK | RTEMS_PREEMPT_MASK ) ) != 0 ) { bool need_thread_dispatch; ISR_lock_Context lock_context; - bool previous_asr_is_enabled; - bool previous_is_preemptible; need_thread_dispatch = false; _Thread_State_acquire( executing, &lock_context ); - previous_asr_is_enabled = asr->is_enabled; - asr->is_enabled = !_Modes_Is_asr_disabled( mode_set ); + if ( ( mask & RTEMS_ASR_MASK ) != 0 ) { + bool previous_asr_is_enabled; - if ( - !previous_asr_is_enabled && - asr->is_enabled && - asr->signals_pending != 0 - ) { - need_thread_dispatch = true; - _Thread_Append_post_switch_action( executing, &api->Signal_action ); + previous_asr_is_enabled = asr->is_enabled; + asr->is_enabled = !_Modes_Is_asr_disabled( mode_set ); + + if ( + !previous_asr_is_enabled && + asr->is_enabled && + asr->signals_pending != 0 + ) { + need_thread_dispatch = true; + _Thread_Append_post_switch_action( executing, &api->Signal_action ); + } } - previous_is_preemptible = executing->is_preemptible; - executing->is_preemptible = _Modes_Is_preempt( mode_set ); + if ( ( mask & RTEMS_PREEMPT_MASK ) != 0 ) { + bool previous_is_preemptible; + + previous_is_preemptible = executing->is_preemptible; + executing->is_preemptible = _Modes_Is_preempt( mode_set ); - if ( executing->is_preemptible && !previous_is_preemptible ) { - need_thread_dispatch = true; - _Scheduler_Schedule( executing ); + if ( executing->is_preemptible && !previous_is_preemptible ) { + need_thread_dispatch = true; + _Scheduler_Schedule( executing ); + } } if ( need_thread_dispatch ) { |