[PATCH 10/13] rtems: Simplify signal handling
Sebastian Huber
sebastian.huber at embedded-brains.de
Wed Feb 17 19:30:25 UTC 2021
Remove superfluous ASR_Information::signals_posted. Move code out of
trivial inline functions.
Update #4244.
---
cpukit/headers.am | 1 -
cpukit/include/rtems/rtems/asrdata.h | 2 -
cpukit/include/rtems/rtems/asrimpl.h | 90 -------------------------
cpukit/include/rtems/rtems/signalimpl.h | 10 ---
cpukit/rtems/src/signalcatch.c | 18 +++--
cpukit/rtems/src/signalsend.c | 23 +++----
cpukit/rtems/src/taskmode.c | 24 +++----
spec/build/cpukit/librtemscpu.yml | 1 -
8 files changed, 33 insertions(+), 136 deletions(-)
delete mode 100644 cpukit/include/rtems/rtems/asrimpl.h
diff --git a/cpukit/headers.am b/cpukit/headers.am
index cf7b715115..169126b61a 100644
--- a/cpukit/headers.am
+++ b/cpukit/headers.am
@@ -250,7 +250,6 @@ include_rtems_rfs_HEADERS += include/rtems/rfs/rtems-rfs-mutex.h
include_rtems_rfs_HEADERS += include/rtems/rfs/rtems-rfs-trace.h
include_rtems_rtems_HEADERS += include/rtems/rtems/asr.h
include_rtems_rtems_HEADERS += include/rtems/rtems/asrdata.h
-include_rtems_rtems_HEADERS += include/rtems/rtems/asrimpl.h
include_rtems_rtems_HEADERS += include/rtems/rtems/attr.h
include_rtems_rtems_HEADERS += include/rtems/rtems/attrimpl.h
include_rtems_rtems_HEADERS += include/rtems/rtems/barrier.h
diff --git a/cpukit/include/rtems/rtems/asrdata.h b/cpukit/include/rtems/rtems/asrdata.h
index b0cb8f3bbc..3f44d3b030 100644
--- a/cpukit/include/rtems/rtems/asrdata.h
+++ b/cpukit/include/rtems/rtems/asrdata.h
@@ -42,8 +42,6 @@ typedef struct {
rtems_asr_entry handler;
/** This field indicates if the task mode the signal will run with. */
rtems_mode mode_set;
- /** This field indicates the signal set that is posted. */
- rtems_signal_set signals_posted;
/** This field indicates the signal set that is pending. */
rtems_signal_set signals_pending;
} ASR_Information;
diff --git a/cpukit/include/rtems/rtems/asrimpl.h b/cpukit/include/rtems/rtems/asrimpl.h
deleted file mode 100644
index e9369079e6..0000000000
--- a/cpukit/include/rtems/rtems/asrimpl.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * @file
- *
- * @ingroup RTEMSImplClassicASR
- *
- * @brief This header file provides the implementation interfaces of
- * the @ref RTEMSImplClassicASR support.
- */
-
-/* COPYRIGHT (c) 1989-2008.
- * On-Line Applications Research Corporation (OAR).
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
- */
-
-#ifndef _RTEMS_RTEMS_ASRIMPL_H
-#define _RTEMS_RTEMS_ASRIMPL_H
-
-#include <rtems/rtems/asrdata.h>
-
-#include <string.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup RTEMSImplClassicASR Asynchronous Signal Routine (ASR)
- *
- * @ingroup RTEMSImplClassic
- *
- * @brief This group contains the implementation to support asynchronous signal
- * routines.
- *
- * @{
- */
-
-/**
- * @brief ASR_Initialize
- *
- * This routine initializes the given RTEMS_ASR information record.
- */
-RTEMS_INLINE_ROUTINE void _ASR_Initialize (
- ASR_Information *asr
-)
-{
- memset(asr, 0, sizeof(*asr));
-}
-
-RTEMS_INLINE_ROUTINE rtems_signal_set _ASR_Swap_signals( ASR_Information *asr )
-{
- rtems_signal_set new_signals_posted;
-
- new_signals_posted = asr->signals_pending;
- asr->signals_pending = asr->signals_posted;
- asr->signals_posted = new_signals_posted;
-
- return new_signals_posted;
-}
-
-RTEMS_INLINE_ROUTINE void _ASR_Post_signals(
- rtems_signal_set signals,
- rtems_signal_set *signal_set
-)
-{
- *signal_set |= signals;
-}
-
-RTEMS_INLINE_ROUTINE rtems_signal_set _ASR_Get_posted_signals(
- ASR_Information *asr
-)
-{
- rtems_signal_set signal_set;
-
- signal_set = asr->signals_posted;
- asr->signals_posted = 0;
-
- return signal_set;
-}
-
-/**@}*/
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-/* end of include file */
diff --git a/cpukit/include/rtems/rtems/signalimpl.h b/cpukit/include/rtems/rtems/signalimpl.h
index 51f742c9fe..db1ff71620 100644
--- a/cpukit/include/rtems/rtems/signalimpl.h
+++ b/cpukit/include/rtems/rtems/signalimpl.h
@@ -31,18 +31,8 @@ extern "C" {
* @ingroup RTEMSImplClassic
*
* @brief This group contains the Signal Manager implementation.
- *
- * @{
*/
-void _Signal_Action_handler(
- Thread_Control *executing,
- Thread_Action *action,
- ISR_lock_Context *lock_context
-);
-
-/**@}*/
-
#ifdef __cplusplus
}
#endif
diff --git a/cpukit/rtems/src/signalcatch.c b/cpukit/rtems/src/signalcatch.c
index e4ff15fd40..8ee22e5ec1 100644
--- a/cpukit/rtems/src/signalcatch.c
+++ b/cpukit/rtems/src/signalcatch.c
@@ -22,7 +22,6 @@
#endif
#include <rtems/rtems/signalimpl.h>
-#include <rtems/rtems/asrimpl.h>
#include <rtems/rtems/tasksdata.h>
#include <rtems/score/threadimpl.h>
@@ -41,12 +40,19 @@ rtems_status_code rtems_signal_catch(
executing = _Thread_State_acquire_for_executing( &lock_context );
api = executing->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
+ asr->handler = asr_handler;
+ asr->mode_set = mode_set;
- if ( asr_handler != NULL ) {
- asr->mode_set = mode_set;
- asr->handler = asr_handler;
- } else {
- _ASR_Initialize( asr );
+ if ( asr_handler == NULL ) {
+ Chain_Node *node;
+
+ asr->signals_pending = 0;
+ node = &api->Signal_action.Node;
+
+ if ( !_Chain_Is_node_off_chain( node ) ) {
+ _Chain_Extract_unprotected( node );
+ _Chain_Set_off_chain( node );
+ }
}
_Thread_State_release( executing, &lock_context );
diff --git a/cpukit/rtems/src/signalsend.c b/cpukit/rtems/src/signalsend.c
index fc8a66b6c6..606ddfcb53 100644
--- a/cpukit/rtems/src/signalsend.c
+++ b/cpukit/rtems/src/signalsend.c
@@ -21,14 +21,13 @@
#endif
#include <rtems/rtems/signalimpl.h>
-#include <rtems/rtems/asrimpl.h>
#include <rtems/rtems/tasksdata.h>
#include <rtems/score/threaddispatch.h>
#include <rtems/score/threadimpl.h>
#include <rtems/sysinit.h>
-void _Signal_Action_handler(
+static void _Signal_Action_handler(
Thread_Control *executing,
Thread_Action *action,
ISR_lock_Context *lock_context
@@ -41,23 +40,20 @@ void _Signal_Action_handler(
(void) action;
- /*
- * Signal Processing
- */
-
api = executing->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
- signal_set = _ASR_Get_posted_signals( asr );
- if ( signal_set == 0 ) {
- return;
- }
+ /* Get and clear the pending signals */
+ signal_set = asr->signals_pending;
+ _Assert( signal_set != 0 );
+ asr->signals_pending = 0;
_Thread_State_release( executing, lock_context );
rtems_task_mode( asr->mode_set, RTEMS_ALL_MODE_MASKS, &prev_mode );
- (*asr->handler)( signal_set );
+ /* Call the ASR handler in the ASR processing mode */
+ ( *asr->handler )( signal_set );
rtems_task_mode( prev_mode, RTEMS_ALL_MODE_MASKS, &prev_mode );
@@ -98,10 +94,12 @@ rtems_status_code rtems_signal_send(
return RTEMS_NOT_DEFINED;
}
+ /* Make the signals of the set pending */
+ asr->signals_pending |= signal_set;
+
if ( asr->is_enabled ) {
Per_CPU_Control *cpu_self;
- _ASR_Post_signals( signal_set, &asr->signals_posted );
_Thread_Add_post_switch_action(
the_thread,
&api->Signal_action,
@@ -111,7 +109,6 @@ rtems_status_code rtems_signal_send(
_Thread_State_release( the_thread, &lock_context );
_Thread_Dispatch_enable( cpu_self );
} else {
- _ASR_Post_signals( signal_set, &asr->signals_pending );
_Thread_State_release( the_thread, &lock_context );
}
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 );
diff --git a/spec/build/cpukit/librtemscpu.yml b/spec/build/cpukit/librtemscpu.yml
index f54673f48c..3d1ec086b6 100644
--- a/spec/build/cpukit/librtemscpu.yml
+++ b/spec/build/cpukit/librtemscpu.yml
@@ -265,7 +265,6 @@ install:
source:
- cpukit/include/rtems/rtems/asr.h
- cpukit/include/rtems/rtems/asrdata.h
- - cpukit/include/rtems/rtems/asrimpl.h
- cpukit/include/rtems/rtems/attr.h
- cpukit/include/rtems/rtems/attrimpl.h
- cpukit/include/rtems/rtems/barrier.h
--
2.26.2
More information about the devel
mailing list