summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2012-11-28 13:33:11 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-12-05 18:07:05 +0100
commitba3163131770e730cbf5168333c84daa57bc14e5 (patch)
treed250d58a3a28149fb41f6d304dd7fdd78028087d
parentscore: Add API extensions post switch list (diff)
downloadrtems-ba3163131770e730cbf5168333c84daa57bc14e5.tar.bz2
rtems: Add signal post switch extension on the fly
-rw-r--r--cpukit/rtems/src/signalcatch.c44
-rw-r--r--cpukit/rtems/src/tasks.c50
2 files changed, 44 insertions, 50 deletions
diff --git a/cpukit/rtems/src/signalcatch.c b/cpukit/rtems/src/signalcatch.c
index 31bb69fe49..1b342e7193 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 2d7784f777..99bcef93c6 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.