[rtems commit] rtems: Add signal post switch extension on the fly

Sebastian Huber sebh at rtems.org
Wed Dec 5 17:09:37 UTC 2012


Module:    rtems
Branch:    master
Commit:    ba3163131770e730cbf5168333c84daa57bc14e5
Changeset: http://git.rtems.org/rtems/commit/?id=ba3163131770e730cbf5168333c84daa57bc14e5

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Wed Nov 28 13:33:11 2012 +0100

rtems: Add signal post switch extension on the fly

---

 cpukit/rtems/src/signalcatch.c |   44 +++++++++++++++++++++++++++++++++++
 cpukit/rtems/src/tasks.c       |   50 ----------------------------------------
 2 files changed, 44 insertions(+), 50 deletions(-)

diff --git a/cpukit/rtems/src/signalcatch.c b/cpukit/rtems/src/signalcatch.c
index 31bb69f..1b342e7 100644
--- a/cpukit/rtems/src/signalcatch.c
+++ b/cpukit/rtems/src/signalcatch.c
@@ -25,8 +25,50 @@
 #include <rtems/rtems/modes.h>
 #include <rtems/rtems/signal.h>
 #include <rtems/score/thread.h>
+#include <rtems/score/apiext.h>
 #include <rtems/rtems/tasks.h>
 
+static void _RTEMS_signal_Post_switch_hook( Thread_Control *executing )
+{
+  ISR_Level          level;
+  RTEMS_API_Control *api;
+  ASR_Information   *asr;
+  rtems_signal_set   signal_set;
+  Modes_Control      prev_mode;
+
+  api = executing->API_Extensions[ THREAD_API_RTEMS ];
+  if ( !api )
+    return;
+
+  /*
+   *  Signal Processing
+   */
+
+  asr = &api->Signal;
+
+  _ISR_Disable( level );
+    signal_set = asr->signals_posted;
+    asr->signals_posted = 0;
+  _ISR_Enable( level );
+
+
+  if ( !signal_set ) /* similar to _ASR_Are_signals_pending( asr ) */
+    return;
+
+  asr->nest_level += 1;
+  rtems_task_mode( asr->mode_set, RTEMS_ALL_MODE_MASKS, &prev_mode );
+
+  (*asr->handler)( signal_set );
+
+  asr->nest_level -= 1;
+  rtems_task_mode( prev_mode, RTEMS_ALL_MODE_MASKS, &prev_mode );
+
+}
+
+static API_extensions_Post_switch_control _RTEMS_signal_Post_switch = {
+  .hook = _RTEMS_signal_Post_switch_hook
+};
+
 rtems_status_code rtems_signal_catch(
   rtems_asr_entry   asr_handler,
   rtems_mode        mode_set
@@ -44,6 +86,8 @@ rtems_status_code rtems_signal_catch(
   _Thread_Disable_dispatch(); /* cannot reschedule while */
                               /*   the thread is inconsistent */
 
+  _API_extensions_Add_post_switch( &_RTEMS_signal_Post_switch );
+
   if ( !_ASR_Is_null_handler( asr_handler ) ) {
     asr->mode_set = mode_set;
     asr->handler = asr_handler;
diff --git a/cpukit/rtems/src/tasks.c b/cpukit/rtems/src/tasks.c
index 2d7784f..99bcef9 100644
--- a/cpukit/rtems/src/tasks.c
+++ b/cpukit/rtems/src/tasks.c
@@ -167,51 +167,6 @@ static void _RTEMS_tasks_Switch_extension(
   }
 }
 
-/*
- *  _RTEMS_tasks_Post_switch_extension
- *
- *  This extension routine is invoked at each context switch.
- */
-
-static void _RTEMS_tasks_Post_switch_extension(
-  Thread_Control *executing
-)
-{
-  ISR_Level          level;
-  RTEMS_API_Control *api;
-  ASR_Information   *asr;
-  rtems_signal_set   signal_set;
-  Modes_Control      prev_mode;
-
-  api = executing->API_Extensions[ THREAD_API_RTEMS ];
-  if ( !api )
-    return;
-
-  /*
-   *  Signal Processing
-   */
-
-  asr = &api->Signal;
-
-  _ISR_Disable( level );
-    signal_set = asr->signals_posted;
-    asr->signals_posted = 0;
-  _ISR_Enable( level );
-
-
-  if ( !signal_set ) /* similar to _ASR_Are_signals_pending( asr ) */
-    return;
-
-  asr->nest_level += 1;
-  rtems_task_mode( asr->mode_set, RTEMS_ALL_MODE_MASKS, &prev_mode );
-
-  (*asr->handler)( signal_set );
-
-  asr->nest_level -= 1;
-  rtems_task_mode( prev_mode, RTEMS_ALL_MODE_MASKS, &prev_mode );
-
-}
-
 API_extensions_Control _RTEMS_tasks_API_extensions = {
   #if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API)
     .predriver_hook = NULL,
@@ -219,10 +174,6 @@ API_extensions_Control _RTEMS_tasks_API_extensions = {
   .postdriver_hook = _RTEMS_tasks_Initialize_user_tasks
 };
 
-API_extensions_Post_switch_control _RTEMS_tasks_API_extensions_post_switch = {
-  .hook = _RTEMS_tasks_Post_switch_extension
-};
-
 User_extensions_Control _RTEMS_tasks_User_extensions = {
   { NULL, NULL },
   { { NULL, NULL }, _RTEMS_tasks_Switch_extension },
@@ -262,7 +213,6 @@ void _RTEMS_tasks_Manager_initialization(void)
   _User_extensions_Add_API_set( &_RTEMS_tasks_User_extensions );
 
   _API_extensions_Add( &_RTEMS_tasks_API_extensions );
-  _API_extensions_Add_post_switch( &_RTEMS_tasks_API_extensions_post_switch );
 
   /*
    *  Register the MP Process Packet routine.




More information about the vc mailing list