summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/src/taskmode.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-03-18 10:37:23 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2021-03-18 10:38:53 +0100
commit50abce31efeb54efd1957143e3cbf279785d8a9b (patch)
treed8f8152c0078abca1562bb024f1f7e9749f4ee8d /cpukit/rtems/src/taskmode.c
parentrtems: Improve semaphore create error checks (diff)
downloadrtems-50abce31efeb54efd1957143e3cbf279785d8a9b.tar.bz2
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.
Diffstat (limited to '')
-rw-r--r--cpukit/rtems/src/taskmode.c38
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 ) {