summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/src/taskmode.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--cpukit/rtems/src/taskmode.c24
1 files changed, 11 insertions, 13 deletions
diff --git a/cpukit/rtems/src/taskmode.c b/cpukit/rtems/src/taskmode.c
index cbf8c06a6b..24905368c3 100644
--- a/cpukit/rtems/src/taskmode.c
+++ b/cpukit/rtems/src/taskmode.c
@@ -21,7 +21,6 @@
#endif
#include <rtems/rtems/tasksdata.h>
-#include <rtems/rtems/asrimpl.h>
#include <rtems/rtems/modesimpl.h>
#include <rtems/rtems/signalimpl.h>
#include <rtems/score/schedulerimpl.h>
@@ -125,21 +124,20 @@ rtems_status_code rtems_task_mode(
*/
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
- bool is_asr_enabled = !_Modes_Is_asr_disabled( mode_set );
+ bool prev_asr_is_enabled;
_Thread_State_acquire( executing, &lock_context );
- if ( is_asr_enabled != asr->is_enabled ) {
- asr->is_enabled = is_asr_enabled;
-
- if ( _ASR_Swap_signals( asr ) != 0 ) {
- needs_asr_dispatching = true;
- _Thread_Add_post_switch_action(
- executing,
- &api->Signal_action,
- _Signal_Action_handler
- );
- }
+ prev_asr_is_enabled = asr->is_enabled;
+ asr->is_enabled = !_Modes_Is_asr_disabled( mode_set );
+
+ if (
+ !prev_asr_is_enabled &&
+ asr->is_enabled &&
+ asr->signals_pending != 0
+ ) {
+ needs_asr_dispatching = true;
+ _Thread_Append_post_switch_action( executing, &api->Signal_action );
}
_Thread_State_release( executing, &lock_context );